在具有不同维度的numpy中创建数组数组

Creating array of arrays in numpy with different dimensions

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

这是怎么回事?

谢谢!

之前已经讨论过了(Why do I get error trying to cast np.array(some_list) ValueError: could not broadcast input array)。基本上 np.array 做三件事之一:

  • 制作一个 n-dimensional 基本 dtype 数组,例如漂浮。

  • 创建对象数据类型数组

  • 报错,说前两个不可以。

这后两个备选方案是备用选项,仅在第一个不可能时才采用。

在不深入了解编译代码如何工作的细节的情况下,显然

会发生什么
np.array([np.zeros((10,3)), np.zeros((10,8))])

是它先看到共同的第一个维度,并由此推导出它可以取第一个选择。看起来它初始化了一个 (10,2) 数组(列表中有 2 个项目),并试图将第一个数组放入第一行,因此尝试将 (10,3) 数组放入 (10, ) 插槽。

因此,如果您真的想要一个对象 dtype 数组,并且不符合第一种或第三种情况,则需要进行某种 'round-about' 创建。

PaulP 和我一直在

探索替代方案

早些时候:

在这个问题中我建议这样迭代:

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


与其迭代 alist,不如这样做:

res[:] = alist

在我尝试过的大多数情况下它似乎都有效,但如果您广播错误,请不要感到惊讶。