我正在编写一个使用NumPy数组的库,我想对任何数据类型执行标量操作。这适用于大多数结构化数组,但在为结构化元素创建具有多个维度的结构化数组时,我遇到了一个问题。例如,
x = np.zeros(10, np.dtype('3float32,int8'))
print(x.dtype)
print(x.shape)
显示
[('f0', '<f4', (3,)), ('f1', 'i1')]
(10,)
但是
x = np.zeros(10, np.dtype('3float32'))
print(x.dtype)
print(x.shape)
产生
float32
(10, 3)
也就是说,创建一个具有单个多维字段的结构化数组似乎会扩展数组形状。这意味着最后一个例子的维数是2,而不是我所期望的1。这里有我遗漏的东西吗,或者有一个已知的解决方法吗?
使用与第一个工作示例中显示的相同的dtype
表示法:
In [92]: x = np.zeros(3, np.dtype([('f0','<f4',(3,))]))
In [93]: x
Out[93]:
array([([0., 0., 0.],), ([0., 0., 0.],), ([0., 0., 0.],)],
dtype=[('f0', '<f4', (3,))])
我通常不使用字符串简写,
In [99]: np.dtype('3float32')
Out[99]: dtype(('<f4', (3,))) # no field name assigned
In [100]: np.zeros(3,_)
Out[100]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]], dtype=float32)
几个逗号分隔的字符串创建命名字段:
In [102]: np.dtype('3float32,i4')
Out[102]: dtype([('f0', '<f4', (3,)), ('f1', '<i4')])