最近,我遇到了np.array(list)
转换的问题。假设我们有一个3个numpy 2D数组的列表,形状为(x, y), (x, y), (x, z)
,因此shape[0]
对于列表中的所有数组都是相同的。在这种情况下,使用
ValueError:无法将形状(x,z)的输入数组广播到 形状(x)
Numpy尝试创建形状(3, x, y)
的数组,而不是让它保持类似列表的结构(不同数组的数组)。
如果至少有一个shape[0]
与另一个不同,我们得到了我们想要的,形状为(3,)
的数组数组
我通过向列表中添加不同类型的元素并使用np.array(list)[:-1]
来克服该问题。那么,这是一个错误,还是我错过了一些东西(比如np.array()params等)?
一些例子:
>>> import numpy as np
>>> x = np.ones((3,2))
>>> y = np.ones((3,2))
>>> z = np.ones((3,3))
>>> a = np.ones((2,3))
>>> xyz = np.array([x,y,z])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (3,2) into shape (3)
>>> xza = np.array([x,z,a])
[array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
array([[ 1., 1., 1.],
[ 1., 1., 1.]])]
>>> xyz2 = np.array([x,y,z,'tmp'])[:-1]
[array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])]
答案 0 :(得分:1)
在版本1.9上,我得到不同的结果(错误)
3个相同形状的数组产生预期的3d数组:
In [726]: np.array([np.ones((3,2)),np.ones((3,2)),np.ones((3,2))]).shape
Out[726]: (3, 3, 2)
但如果列不同,我会得到3x3对象数组,填充无:
In [727]: np.array([np.ones((3,2)),np.ones((3,2)),np.ones((3,3))])
Out[727]:
array([[None, None, None],
[None, None, None],
[None, None, None]], dtype=object)
你的版本是什么?有关正在开发的区域的更多证据。这个测试敲响了钟声 - 我想我以前见过这样的问题。但我不确定如何搜索它。
匹配github问题:
https://github.com/numpy/numpy/issues/6591
和您的评论:
https://github.com/numpy/numpy/issues/7103
引用了最近的SO问题(我必须看过):
ValueError: cannot copy sequence with size 5 to array axis with dimension 2
如您所说,如果第一个维度不同,则会创建对象数组。
我最常见的是使用1d数组或列表,例如
In [711]: np.array([[1,2,3],[2,3,4],[4,5,6]])
Out[711]:
array([[1, 2, 3],
[2, 3, 4],
[4, 5, 6]])
In [712]: np.array([[1,2,3],[2,3,4],[4,5]])
Out[712]: array([[1, 2, 3], [2, 3, 4], [4, 5]], dtype=object)
我还建议创建一个np.array((3,),dtype=object)
数组,然后填充它。
看起来它正在测试第一个维度的均匀性,并开始填充它。你的错误表明它正在尝试做一些广播,虽然我不能想到一个有效的例子。
我们可以检查numpy Github问题。可能存在与对象数组相关的各种各样的对象。这是一种后来的角色,将numpy阵列扩展到原始的统一多维概念之外。