我想操作“锯齿状阵列”,我更喜欢写作 “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)
帮助?
答案 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数组的速度不同。