【问题标题】:Creating array of arrays in numpy with different dimensions在numpy中创建具有不同维度的数组数组
【发布时间】:2018-08-13 12:45:31
【问题描述】:

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

发生了什么事?

谢谢!

【问题讨论】:

  • 我没有很好的解释,除了这是一个错误,但这里有一个解决方法:L = [np.zeros((10,3)), np.zeros((10,8))]result = np.frompyfunc(L.__getitem__, 1, 1)(range(len(L)))
  • 感谢您的回答!效果很好!!

标签: arrays numpy dimensions valueerror


【解决方案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) 数组放入 (10, ) 插槽。

因此,如果您真的想要一个对象 dtype 数组,并且没有遇到第一种或第三种情况,您需要进行某种“循环”创建。

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


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

res[:] = alist

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多