如何在 Numpy 中更改结构化数组项的大小?

How to change a structured array item size in Numpy?

我正在尝试更改 Numpy 结构化数组中项目的大小。以下代码触发了一个错误,指出由于大小差异无法广播数组。除了创建新的结构化数组之外,还有什么方法可以实现我的目标吗?

import numpy as np

x = np.zeros(1, dtype=['value','f4',(2,3)])
x['value'][0] = np.random.rand(4,2)

您不能更改结构化数组中字段的大小或形状。您可以更改 dtype 的一些值(也许是名称?)。但是控制数据布局的东西,例如每个元素的字节数,不能就地改变。您需要创建一个新数组,并传输数据(如果可能)。

最初,您要为 x 的每个元素分配一个 (2,3) 浮点数组。所以每个的大小是 6*4 ('f4') 字节。然后你想写一个(4,2)数组到同一个槽,8*4字节。放不下。

使用 numpy 数组的全部意义在于定义固定大小的对象,可以以多维方式快速遍历这些对象。

你可以定义:

x=np.zeros(1, dtype=[('value', object)])

现在可以写一个(2,3)数组到x['value'][0],然后写一个(4,2)数组到。 x 数据仅包含指向存在于内存中其他位置的数组或其他对象的指针。

更好的是,使用 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 'rows' 是一个 (3,2,3) 数组

x['value'].shape
# (3, 2, 3)