【问题标题】:dimensions of array of arrays in numpynumpy中数组数组的维度
【发布时间】:2017-09-12 13:12:13
【问题描述】:

我想对“锯齿状数组”进行操作,我更喜欢写 “一个+一个” 代替 "[x + y for x,y in zipped(A,A)]"

为此,我想将不同大小的数组列表转换为一个整体的 numpy 数组,但由于看似过于热心的广播而遇到错误(注意前三个成功,但最后一个失败):

In[209]: A = array([ones([3,3]), array([1, 2])])
In[210]: A = array([ones([3,3]), array([1, 2])], dtype=object)
In[211]: A = array([ones([3,2]), array([1, 2])], dtype=object)
In[212]: A = array([ones([2,2]), array([1, 2])], dtype=object)
Traceback (most recent call last):
  File "/home/hzhang/.conda/envs/myenv/lib/python3.4/site-
packages/IPython/core/interactiveshell.py", line 2881, in run_code
  exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-212-7297723106f9>", line 1, in <module>
  A = array([ones([2,2]), array([1, 2])], dtype=object)
ValueError: could not broadcast input array from shape (2,2) into shape (2)

帮助?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您的情况是我回答中第三种情况的变体

    How to keep numpy from broadcasting when creating an object array of different shaped arrays

    np.array 尝试从输入列表中创建一个多维数字数组。如果组件尺寸差异很大,它会采取保持数组分离的方式,而是创建一个对象数组。我认为这种数组是一个美化/贬低的列表。

    How to store multiple numpy 1d arrays with different lengths and print it

    在您的问题案例中,尺寸足够接近以至于它“认为”它可以创建一个二维数组,但是当它开始填充这些值时,它发现它无法广播值来这样做,因此抛出错误。有人可能会争辩说,它应该回溯并采用“对象”数组路线。但是该决策树深埋在已编译的代码中。

    之前的 SO 问题中的问题案例是

    np.array([np.zeros((2, 2)), np.zeros((2,3))])
    

    第一个维度匹配,但第二个不匹配。我不完全确定为什么您的 IN[211] 有效但 In[212] 无效。但是错误信息是一样的,一直到 (2,2) => (2) 尝试。

    编辑

    哎呀-我首先将您的问题示例读为:

    np.array([np.ones([2,2]), np.ones([1, 2])], dtype=object)
    

    也就是说,将 (2,2) 与 (1,2) 结合起来,确实会产生 (2,) 对象。你实际上结合的是一个

     (2,2) with a (2,) 
    

    所以看起来目标是np.empty((2,2),float)(或object),因为out[...]=[ones([2,2]), array([1,2])]会产生这个错误。


    无论如何,创建对象数组最可靠的方法是对其进行初始化,然后复制数组。

    Out[90]: array([None, None], dtype=object)
    In [91]: arr[:]=[ones([2,2]), array([1, 2])]
    In [92]: arr
    Out[92]: 
    array([array([[ 1.,  1.],
           [ 1.,  1.]]), array([1, 2])], dtype=object)
    

    对这样的对象数组进行数学运算时要小心。有效的是命中或错过:

    In [93]: A+A
    Out[93]: 
    array([array([[ 2.,  2.],
           [ 2.,  2.],
           [ 2.,  2.]]),
           array([2, 4])], dtype=object)
    
    In [96]: np.min(A[1])
    Out[96]: 1
    In [97]: np.min(A)
    ....
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    
    In [98]: A.sum()
    Out[98]: 
    array([[ 2.,  3.],
           [ 2.,  3.],
           [ 2.,  3.]])
    

    这是因为A[0]+A[1] 有效。 A[1] 是 (2,) 广播到 (3,2)。

    对于对象数组numpy 诉诸某种列表理解,迭代对象元素。所以可能会得到数组表示法的便利,但速度与真正的二维数组不同。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 2014-02-20
      • 2015-07-29
      • 1970-01-01
      相关资源
      最近更新 更多