我想采用一个包含多个命名字段的现有数组,并创建一个新数组(或就地更改它),其中一个字段的分层数据类型等于原始数据类型。也就是说,
newarray = np.array(oldarray, dtype=[('old',oldarray.dtype)])
使得newarray['old']
在形状和结构上与oldarray
相同
这是一个例子:
In [1]: import numpy as np
In [2]: dt = np.dtype([('name',np.str_,2),('val',np.float_)])
In [3]: constants = np.array([('pi',3.14),('e',2.72)],dtype=dt)
In [4]: constants
Out[4]:
array([('pi', 3.14), ('e', 2.72)],
dtype=[('name', '|S2'), ('val', '<f8')])
In [5]: numbers = constants.astype([('constants',dt)])
但这给了我全零:
In [6]: numbers
Out[6]:
array([(('', 0.0),), (('', 0.0),)],
dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])
如果我尝试复制,也会遇到同样的问题:
In [7]: numbers = np.array(constants,dtype=[('constants',dt)])
In [8]: numbers
Out[8]:
array([(('', 0.0),), (('', 0.0),)],
dtype=[('constants', [('name', '|S2'), ('val', '<f8')])])
另外:有人知道为什么会发生这种情况吗?
最佳答案
您可以调用view
具有新数据类型的原始数组(http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html):
>>> import numpy as np
>>> dt = np.dtype([('name',np.str_,2),('val',np.float_)])
>>> constants = np.array([('pi',3.14),('e',2.72)],dtype=dt)
>>>
>>> numbers = constants.view([('constants',dt)])
>>>
>>> numbers['constants']
array([('pi', 3.14), ('e', 2.72)],
dtype=[('name', '|S2'), ('val', '<f8')])
请注意,生成的数组 numbers
是原始数组的 View ,因此其中一个数组的更改也会影响另一个数组。
关于python - 将层次结构添加到 numpy 结构化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14190425/