Python 列表到numpy数组转换可能存在的错误

Python 列表到numpy数组转换可能存在的错误,python,arrays,numpy,Python,Arrays,Numpy,最近,我遇到了np.array(list)转换的问题。假设我们有一个包含3个numpy 2D数组的列表,这些数组的形状(x,y)、(x,y)、(x,z),因此形状[0]对于列表中的所有数组都是相同的。在这种情况下,到阵列的转换将失败 ValueError:无法将输入数组从形状(x,z)广播到 形状(x) Numpy尝试创建和创建形状(3,x,y)的数组,而不是将其保留为类似列表的结构(不同数组的数组)。 如果至少有一个形状[0]与另一个不同,我们就得到了我们想要的,形状(3,)的数组 我通过向列

最近,我遇到了
np.array(list)
转换的问题。假设我们有一个包含3个numpy 2D数组的列表,这些数组的形状
(x,y)、(x,y)、(x,z)
,因此
形状[0]
对于列表中的所有数组都是相同的。在这种情况下,到阵列的转换将失败

ValueError:无法将输入数组从形状(x,z)广播到 形状(x)

Numpy尝试创建和创建形状
(3,x,y)
的数组,而不是将其保留为类似列表的结构(不同数组的数组)。 如果至少有一个
形状[0]
与另一个不同,我们就得到了我们想要的,形状
(3,)
的数组

我通过向列表中添加不同类型的元素,并使用
np.array(list)[:-1]
克服了这个问题。那么,这是一个bug,还是我遗漏了什么(比如np.array()参数,等等)

一些例子:

>>> 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.]])]
>>将numpy作为np导入
>>>x=np.一((3,2))
>>>y=np.one((3,2))
>>>z=np.one((3,3))
>>>a=np.一((2,3))
>>>xyz=np.数组([x,y,z])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:无法将输入数组从形状(3,2)广播到形状(3)
>>>xza=np.数组([x,z,a])
[数组([[1,1.],
[ 1.,  1.],
[ 1.,  1.]]) 
数组([[1,1,1.],
[ 1.,  1.,  1.],
[ 1.,  1.,  1.]])
数组([[1,1,1.],
[ 1.,  1.,  1.]])]
>>>xyz2=np.array([x,y,z,'tmp'])[:-1]
[数组([[1,1.],
[ 1.,  1.],
[ 1.,  1.]])
数组([[1,1.],
[ 1.,  1.],
[ 1.,  1.]])
数组([[1,1,1.],
[ 1.,  1.,  1.],
[ 1.,  1.,  1.]])]

在1.9版上,我得到了不同的结果(错误)

3个相同形状的阵列生成预期的三维阵列:

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问题:

根据你的评论:

其中提到了最近的一个SO问题(我一定看过):


正如您所说,如果第一个维度不同,它将创建对象数组

最常见的是我在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数组扩展到了原始的统一多维概念之外。

谢谢您的回答!我的numpy版本是1.10.1。看起来,他们注意到了错误,所以现在它抛出ValueError而不是'None's数组。我研究了GitHub问题,发现了这一点。不是完全相同的问题,但我想它来自同一个地方。可能正在实施完整形状(不仅仅是第一个尺寸)检查将有所帮助。