[英]dimensions of array of arrays in numpy
我想对“锯齿状数组”进行操作,并且我更喜欢写“ A + A”,而不是“ [zipped(A,A)中x,y的[x + y]”
为此,我想将不同大小的数组列表转换为整个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)
救命?
您的情况是我回答的第三种情况的变体
np.array
尝试从输入列表中创建数字的多维数组。 如果组件尺寸足够不同,则将阵列分开,而改为对象阵列。 我认为这种数组是光荣/降级的列表。
在您遇到问题的情况下,尺寸足够接近,以至于它“认为”它可以制成2d数组,但是当它开始填充这些值时,会发现它无法广播值,从而引发错误。 有人可能会辩称它应该回溯并采用“对象”阵列路线。 但是该决策树深深地埋在了已编译的代码中。
在较早的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]
是广播到(3,2)的(2,)。
使用对象数组时, numpy
依靠某种列表理解来遍历对象元素。 这样可能会获得数组表示法的便利,但是速度与真正的2d数组的速度不一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.