我正在尝试更改 Numpy 结构化数组中项目的大小。以下代码触发了一个错误,指出由于大小差异,无法广播该数组。除了制作新的结构化数组之外,有没有办法实现我的目标?
import numpy as np
x = np.zeros(1, dtype=['value','f4',(2,3)])
x['value'][0] = np.random.rand(4,2)
我正在尝试更改 Numpy 结构化数组中项目的大小。以下代码触发了一个错误,指出由于大小差异,无法广播该数组。除了制作新的结构化数组之外,有没有办法实现我的目标?
import numpy as np
x = np.zeros(1, dtype=['value','f4',(2,3)])
x['value'][0] = np.random.rand(4,2)
您无法更改结构化数组中字段的大小或形状。可能有一些dtype
您可以更改的值(可能是名称?)。但是控制数据布局的东西,例如每个元素的字节数,不能原地改变。您需要创建一个新数组并传输数据(如果可能)。
最初,您将一个(2,3)
浮点数组分配给 x 的每个元素。所以每个的大小是 6*4 ('f4') 字节。然后你想将一个(4,2)
数组写入同一个插槽,8*4 字节。它装不下。
使用numpy
数组的全部意义在于定义固定大小的对象,这些对象可以以多维方式快速遍历。
你可以定义:
x=np.zeros(1, dtype=[('value', object)])
现在您可以将(2,3)
数组写入x['value'][0]
,然后将(4,2)
数组写入。 x
data 仅包含指向内存中其他位置的数组或其他对象的指针。
更好的是,使用 Python 列表。
x
用更多元素查看您的原件可能会有所帮助
x=np.zeros(3, dtype=[('value', 'f4', (2,3))])
重复 (2,3) 模式:
array([([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],),
([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],),
([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],)],
dtype=[('value', '<f4', (2, 3))])
如果你只看这个字段,你会得到一个 3d 数组,(2,3) 数组的 3 个“行”是一个 (3,2,3) 数组
x['value'].shape
# (3, 2, 3)