我试图创建一个numpy数组数组,每个数组都有不同的维度。 到目前为止,似乎还不错。例如,如果我运行:
np.array([np.zeros((10,3)), np.zeros((11,8))])
结果是:
array([ 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.]]),
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., 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.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.]])], dtype=object)
两个矩阵的维度完全不同,生成的数组没有任何问题。但是,如果两个矩阵的第一维相同,它就不再起作用了:
np.array([np.zeros((10,3)), np.zeros((10,8))])
Traceback (most recent call last):
File "<ipython-input-123-97301e1424ae>", line 1, in <module>
a=np.array([np.zeros((10,3)), np.zeros((10,8))])
ValueError: could not broadcast input array from shape (10,3) into shape (10)
发生了什么事?
谢谢!
答案 0 :(得分:1)
此之前已被删除(Why do I get error trying to cast np.array(some_list) ValueError: could not broadcast input array;
Numpy array in array with unequal length)。基本上np.array
执行以下三项操作之一:
制作基本dtype的n维数组,例如浮动。
制作一个对象dtype数组
提出错误,说前两个是不可能的。
这两个备选方案是后备选项,只有在第一个不可能时才采用。
没有深入研究编译代码如何工作的细节,显然
会发生什么np.array([np.zeros((10,3)), np.zeros((10,8))])
是它首先看到共同的第一个维度,并从中推断它可以采取第一个选择。看起来它初始化了一个(10,2)数组(列表中的2个项目),并试图将第一个数组放入第一行,因此尝试将(10,3)数组放入a(10, )插槽。
因此,如果你真的想要一个对象dtype数组,而不是第一或第三种情况,你需要做一些'round-about'创建。
PaulP和我一直在Force numpy to create array of objects
中探索替代方案早些时候:How to create a numpy array of lists?
在这个问题中我建议这个迭代:
A=np.empty((3,),dtype=object)
for i,v in enumerate(A): A[i]=[v,i]
或在你的情况下
In [451]: res = np.empty(2, object)
In [452]: alist = [np.zeros((10,3)), np.zeros((10,8))]
In [453]: for i,v in enumerate(alist):
...: res[i] = v