使用不同的维度创建numpy数组

时间:2018-03-05 19:00:12

标签: arrays numpy dimensions valueerror

我试图创建一个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)

发生了什么事?

谢谢!

1 个答案:

答案 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

Prevent numpy from creating a multidimensional array