Numpy 数组错误

Numpy Array bug

我有一个数组

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 列表。有人可以帮忙吗?

这是您要实现的目标吗?

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])

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

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

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

实际上给 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 数组期望过高。数学是 hit-or-miss。有些东西可以工作 - 如果他们可以将操作委托给元素。其他的不行:

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'

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