0

我正在尝试更改 Numpy 结构化数组中项目的大小。以下代码触发了一个错误,指出由于大小差异,无法广播该数组。除了制作新的结构化数组之外,有没有办法实现我的目标?

import numpy as np

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

1 回答 1

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)数组写入。 xdata 仅包含指向内存中其他位置的数组或其他对象的指针。

更好的是,使用 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)
于 2015-02-18T06:52:50.797 回答