如何在 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)
我正在尝试更改 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)