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

问题描述 投票:2回答:1

我正在尝试创建一个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)

到底是怎么回事?

谢谢!

arrays numpy dimensions valueerror
1个回答
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做3件事之一:

  • 制作基本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

© www.soinside.com 2019 - 2024. All rights reserved.