【发布时间】:2017-08-27 15:57:42
【问题描述】:
我尝试使用np.save 将不同形状的数组列表存储为dtype=object 数组(我知道我可以只腌制列表,但我真的很好奇如何做到这一点)。
如果我这样做:
import numpy as np
np.save('test.npy', [np.zeros((2, 2)), np.zeros((3,3))])
它有效。 但是这个:
np.save('test.npy', [np.zeros((2, 2)), np.zeros((2,3))])
给我一个错误:
ValueError: could not broadcast input array from shape (2,2) into shape (2)
我猜np.save先把列表转成数组,所以我试了一下:
x=np.array([np.zeros((2, 2)), np.zeros((3,3))])
y=np.array([np.zeros((2, 2)), np.zeros((2,3))])
效果相同(第一个有效,第二个无效。
生成的 x 行为符合预期:
>>> x.shape
(2,)
>>> x.dtype
dtype('O')
>>> x[0].shape
(2, 2)
>>> x[0].dtype
dtype('float64')
我也尝试强制使用 'object' dtype:
np.array([np.zeros((2, 2)), np.zeros((2,3))], dtype=object)
没有成功。似乎 numpy 尝试将具有相同第一维的数组广播到新数组中,并且意识到它们的形状不同为时已晚。奇怪的是,它似乎在某一时刻奏效了——所以我真的很好奇有什么区别,以及如何正确地做到这一点。
编辑:
我发现了它之前的情况:唯一的区别似乎是列表中的 numpy 数组具有另一种数据类型。
它适用于dtype('<f8'),但不适用于dtype('float64'),我什至不确定有什么区别。
编辑 2: 我找到了一种非常非pythonic的方法来解决我的问题,我在这里添加它,也许它有助于理解我想要做什么:
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):
save_array[idx] = arr
np.save('test.npy', save_array)
【问题讨论】:
标签: python python-2.7 numpy array-broadcasting