【问题标题】:Numpy Array bugNumpy 数组错误
【发布时间】:2019-07-15 16:20:13
【问题描述】:

我有一个数组

array = [np.array([[0.76103773], [0.12167502]]),
         np.array([[ 0.72017135,  0.1633635 ,  0.39956811,  0.91484082, 0.76242736, -0.39897202],
                  [0.38787197, -0.06179132, -0.04213892,  0.16762614,  0.05880554, 0.59370467]])]

我想将它转换成一个包含 numpy ndarrays 的 numpy 对象数组。所以我试过了,np.array(array)np.array(array, dtype=object)np.array(array, dtype=np.object) 但是他们都给出了同样的错误,ValueError: could not broadcast input array from shape (2,1) into shape (2)。所以基本上,最终结果应该是一样的,只是最终结果的类型是一个numpy对象数组,而不是一个python列表。有人可以帮忙吗?

【问题讨论】:

  • 不清楚你的意思,你只想reshape吗?或者可能只是添加一个新轴:array[:, :, None]?哦,等等,你是不是想把不同大小的数组放入父数组中?您不能这样做,请改用列表。
  • 我只想要相同的列表,但我想要一个包含相同元素的 numpy 对象数组而不是列表@Dan
  • 你为什么要那个?为什么列表不够好?如果您解释最终目标,这将有所帮助。我很确定您不能像使用列表那样将不同大小的数组放入另一个数组的元素中。这不是数组的目的。
  • @Dan 最后我想做array1-array2,它们都是numpy对象数组,但各自的元素具有相同的形状,我将数组相互减去。我可以使用列表推导来做到这一点,但这样做似乎更整洁。
  • 列表理解是这里的方法,除非你愿意填充它,否则你不能用数组做到这一点。数组的形状必须是超矩形。想想arr.shape 会为您描述的情况返回什么,这没有任何意义。

标签: python python-3.x numpy numpy-ndarray


【解决方案1】:

您的列表包含 (2,1) 和 (2,6) 形状的数组。

np.array 尝试从输入创建一个多维数组。这适用于具有匹配形状(或长度和嵌套)的输入。如果失败,它会退回到创建对象 dtype 数组。

但是在输入数组的第一个维度匹配的情况下会产生这种错误。显然它已经初始化了一个“空白”数组,并试图将列表数组复制到其中。详细的没看,但是之前看到过错误信息。

实际上给np.array 一个不同大小的数组列表,迫使它使用一些备份方法。所以产生一个对象数组,其他的产生这种错误。如果您的列表包含所有相同形状的数组,则结果将是 3d 数组,而不是对象数组。

创建具有给定形状的对象数组的最可靠方法是对其进行初始化,然后从列表中复制。

In [66]: alist =[np.array([[0.76103773], [0.12167502]]), 
    ...:          np.array([[ 0.72017135,  0.1633635 ,  0.39956811,  0.91484082, 0.76242736, -0.39897202], 
    ...:                   [0.38787197, -0.06179132, -0.04213892,  0.16762614,  0.05880554, 0.59370467]])]   
In [67]: alist[0].shape                                                                                      
Out[67]: (2, 1)
In [68]: alist[1].shape                                                                                      
Out[68]: (2, 6)
In [69]: np.array(alist, object)                                                                             
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-69-261e1ad7e5cc> in <module>
----> 1 np.array(alist, object)

ValueError: could not broadcast input array from shape (2,1) into shape (2)
In [70]: arr = np.zeros(2, object)                                                                           
In [71]: arr[:] = alist                                                                                      
In [72]: arr                                                                                                 
Out[72]: 
array([array([[0.76103773],
       [0.12167502]]),
       array([[ 0.72017135,  0.1633635 ,  0.39956811,  0.91484082,  0.76242736,
        -0.39897202],
       [ 0.38787197, -0.06179132, -0.04213892,  0.16762614,  0.05880554,
         0.59370467]])], dtype=object)

不要对对象 dtype 数组抱有太多期望。数学是命中注定的。有些东西有效 - 如果他们可以将动作委托给元素。其他的不行:

In [73]: arr - arr                                                                                           
Out[73]: 
array([array([[0.],
       [0.]]),
       array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])], dtype=object)
In [74]: np.log(arr)                                                                                         
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-74-a67b4ae04e95> in <module>
----> 1 np.log(arr)

AttributeError: 'numpy.ndarray' object has no attribute 'log'

即使数学有效,它也不比列表理解快。事实上,对象数组的迭代比列表的迭代要慢。

【讨论】:

  • 但是不初始化就不能完成吗?比如,一行?
  • 不!正如您发现的那样,np.array 对结果的所需形状做出了错误的猜测。这是捏造的,并不总是正确的。
【解决方案2】:

这是你想要完成的吗?

array1 =  np.array([[0.76103773], [0.12167502]])
array2 = np.array([[ 0.72017135,  0.1633635 ,  0.39956811,  0.91484082, 0.76242736, -0.39897202],[0.38787197, -0.06179132, -0.04213892,  0.16762614, 0.05880554, 0.59370467]])
result = np.hstack([array1,array2])

编辑: 也许是这个?

array1 =  [[0.76103773], [0.12167502]]
array2 = [[ 0.72017135,  0.1633635 ,  0.39956811,  0.91484082, 0.76242736, -0.39897202],[0.38787197, -0.06179132, -0.04213892,  0.16762614,  0.05880554, 0.59370467]]
result = np.array([array1,array2])

编辑 2:

好的,让我们再试一次。我想就是这样。

array1 =  np.array([[0.76103773], [0.12167502]])
array2 = np.array([[ 0.72017135,  0.1633635 ,  0.39956811,  0.91484082, 0.76242736, -0.39897202],[0.38787197, -0.06179132, -0.04213892,  0.16762614,  0.05880554, 0.59370467]])
#solution is either
result = np.array([array1,array2.transpose()])
#or this 
result2 = np.array([array1.transpose(),array2])

【讨论】:

  • 不,我只想要相同的数组,但是,一个 numpy 对象数组
  • 编辑:不,第二种方法,给了我一个 numpy 对象数组,但它是由列表组成的,而不是 numpy nd 数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2023-03-17
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多