python - 将层次结构添加到 numpy 结构化数组

标签 python numpy recarray

我想采用一个包含多个命名字段的现有数组,并创建一个新数组(或就地更改它),其中一个字段的分层数据类型等于原始数据类型。也就是说,

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/

相关文章:

python - 在 numpy rearray 中查找接近的元素

python - 删除 numpy 重新数组中的一行

python - 如何在 Ubuntu 中安装 GDAL?

python - 当一种数据类型是对象时,numpy 掩码数组的行为有所不同

python - 将 Paho MQTT 与 Django 集成

python-3.x - Python OpenCV - 如何保存 5 channel 图像

python - Numpy:从点列表中获取最大值的正确方法

python - aws - "Unable to import module ' 进程' :/var/task/numpy/core/multiarray. 所以:ELF header 无效”

python - 从不比较两个列表元素两次的列表中随机选择(Python)

python - 从 .ui 自动完成