2

我通常会像这样创建 numpy dtypes:

C = np.dtype([('a',int),('b',float)])

但是在我的代码中,我还使用了这些字段ab在其他地方单独使用:

A = np.dtype([('a',int)])
B = np.dtype([('b',float)])

为了可维护性,我想C从类型中派生出来A,并且B以某种方式是这样的:

C = np.dtype([A,B])    # this gives a TypeError

numpy 有没有办法通过组合其他 dtypes 来创建复杂的 dtypes?

4

3 回答 3

4

您可以使用.descrdtypes 的属性组合字段。例如,这里是你的Aand B。请注意,.descr属性是一个列表,其中包含每个字段的条目:

In [44]: A = np.dtype([('a',int)])

In [45]: A.descr
Out[45]: [('a', '<i8')]

In [46]: B = np.dtype([('b',float)])

In [47]: B.descr
Out[47]: [('b', '<f8')]

因为.descr属性的值是列表,所以可以添加它们以创建新的 dtype:

In [48]: C = np.dtype(A.descr + B.descr)

In [49]: C
Out[49]: dtype([('a', '<i8'), ('b', '<f8')])
于 2016-09-14T17:58:05.883 回答
4

根据dtype文档,dtypes 有一个属性descr,它提供“数据类型的符合数组接口的完整描述”。所以:

A = np.dtype([('a',int)])    # A.descr -> [('a', '<i4')]
B = np.dtype([('b',float)])  # B.descr -> [('b', '<f8')]
# then
C = np.dtype([A.descr[0], B.descr[0]])
于 2016-09-14T17:58:15.920 回答
0

有一个死水模块,numpy其中有一堆结构化/rec 数组实用程序。

zip_descr进行这种descr连接,但它以数组而不是dtypes

In [77]: import numpy.lib.recfunctions as rf
In [78]: rf.zip_descr([np.zeros((0,),dtype=A),np.zeros((0,),dtype=B)])
Out[78]: [('a', '<i4'), ('b', '<f8')]
In [81]: rf.zip_descr([np.array((0,),dtype=A),np.array((0,),dtype=B)])
Out[81]: [('a', '<i4'), ('b', '<f8')]
于 2016-09-14T18:29:31.550 回答