【问题标题】:List to numpy array conversion possible bug列表到 numpy 数组转换可能的错误
【发布时间】:2016-05-27 09:18:25
【问题描述】:

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

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

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

我通过将不同类型的元素添加到列表中并使用np.array(list)[:-1] 克服了这个问题。那么,这是一个错误,还是我错过了一些东西(比如 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.]])]

【问题讨论】:

    标签: python arrays numpy


    【解决方案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 对象数组,其中填充为 None:

    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


    如你所说,如果第一个维度不同,它会创建对象数组。

    我最常看到的是一维数组或列表,例如

    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 问题,发现 issue。不完全相同的问题,但它源于我想的同一个地方。可能正在实施完整的形状(不仅是第一维)检查会有所帮助。
    猜你喜欢
    • 2015-12-01
    • 2017-10-19
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2014-08-12
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多