numpy中数组数组的维数

时间:2017-04-16 22:05:44

标签: python arrays numpy

我想操作“锯齿状阵列”,我更喜欢写作 “A + A” 代替 “[x + y代表x,y代表拉链(A,A)]”

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

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)

帮助?

1 个答案:

答案 0 :(得分:1)

在我的回答

中,您的案例是第3个案例的变体

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)=&gt; (2)尝试。

修改

oops - 我首先将您的问题示例读作:

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使用某种列表理解,迭代对象元素。因此可能会获得数组表示法的便利,但速度与使用真正的2d数组的速度不同。