列出numpy数组转换可能的bug

时间:2016-02-16 07:52:09

标签: python arrays numpy

最近,我遇到了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.]])]

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阵列扩展到原始的统一多维概念之外。