小编ric*_*ich的帖子

创建不同形状的数组的对象数组时,如何防止numpy广播

我尝试dtype=object使用数组将不同形状的数组的列表存储为数组np.save(我知道我可以腌制该列表,但是我很好奇如何做到这一点)。如果我这样做:

import numpy as np
np.save('test.npy', [np.zeros((2, 2)), np.zeros((3,3))])
Run Code Online (Sandbox Code Playgroud)

有用。但是这个:

np.save('test.npy', [np.zeros((2, 2)), np.zeros((2,3))])
Run Code Online (Sandbox Code Playgroud)

给我一个错误:

ValueError: could not broadcast input array from shape (2,2) into shape (2)
Run Code Online (Sandbox Code Playgroud)

我想首先np.save将列表转换为数组,所以我尝试了:

x=np.array([np.zeros((2, 2)), np.zeros((3,3))])
y=np.array([np.zeros((2, 2)), np.zeros((2,3))])
Run Code Online (Sandbox Code Playgroud)

具有相同的效果(第一个起作用,第二个不起作用。结果x表现为预期的:

>>> x.shape
(2,)
>>> x.dtype
dtype('O')
>>> x[0].shape
(2, 2)
>>> x[0].dtype
dtype('float64')
Run Code Online (Sandbox Code Playgroud)

我还尝试强制使用'object'dtype:

np.array([np.zeros((2, 2)), np.zeros((2,3))], dtype=object)
Run Code Online (Sandbox Code Playgroud)

没有成功。似乎numpy尝试将具有相同一维的数组广播到新数组中,并且意识到它们的形状不同为时已晚。奇怪的是,它似乎只在某一点上起作用了-所以我真的很好奇差异是什么,以及如何正确地做到这一点。


编辑:我之前弄清楚了它的工作情况:唯一的区别似乎是列表中的numpy数组具有另一种数据类型。它适用于dtype('<f8'),但不适用dtype('float64'),我什至不知道有什么区别。


编辑2:我发现了一种非常非Python的方式来解决我的问题,我在这里添加了它,也许有助于理解我想做什么:

array_list=np.array([np.zeros((2, 2)), np.zeros((2,3))])
save_array = np.empty((len(array_list),), dtype=object)
for idx, arr in enumerate(array_list): …
Run Code Online (Sandbox Code Playgroud)

python numpy python-2.7 numpy-broadcasting

5
推荐指数
1
解决办法
842
查看次数

标签 统计

numpy ×1

numpy-broadcasting ×1

python ×1

python-2.7 ×1