ValueError: could not broadcast input array from shape (49041,4) into shape (49041)

ValueError: could not broadcast input array from shape (49041,4) into shape (49041)

这是我的代码。 我越来越广泛 error.I 无法理解为什么?我已经查看了其他类似的问题,这些问题谈到了尺寸问题,但我无法找到 problem.Any 帮助表示赞赏。 提前致谢。 我附上了图片。 Broadcast error

两个数组(ns 和 X_train_grade_encoded)的形状相同,但有错误,为什么?

所以我看了你的笔记本图片。这是一个需要缩放才能阅读的小 png。我们强烈鼓励,有些人甚至要求您复制粘贴代码和错误。我们需要看到问题,就在前面,而不是隐藏的。否则我们可能会转到下一个问题。

broadcast 错误通常发生在对两个数组进行某种数学运算时,或者(我的第二个猜测)将一个数组分配给另一个数组的一部分时。但是这个案例比较晦涩,它试图从 (n,4) 和 (n,300) 形状的数组中创建一个对象 dtype 数组。

您正在做 hstack((ns, array2))。使用普通的 np.hstack 可以工作并产生 (n, 304) 形状的数组。但是你正在使用 scipy.sparse.hstack。我不知道那是故意的还是错误的。您没有暗示您正在处理 sparse 矩阵。

ns 可能是从稀疏矩阵构造的,因为您使用 toarray()。但它现在是一个密集的(numpy)数组。

sparse.hstack 适用于稀疏矩阵,返回稀疏矩阵。我不知道使用密集数组输入的确切限制。我相信它可以将密集转换为 coo 稀疏,然后进行连接,但这里的错误发生在它到达那一步之前。


这重现了您的错误:

In [37]: from scipy import sparse  

尝试在两个密集数组上使用稀疏 hstack:

In [38]: sparse.hstack([np.ones((3,4)),np.zeros((3,2))])                        
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-38-a9d8036b5a44> in <module>
----> 1 sparse.hstack([np.ones((3,4)),np.zeros((3,2))])

/usr/local/lib/python3.6/dist-packages/scipy/sparse/construct.py in hstack(blocks, format, dtype)
    463 
    464     """
--> 465     return bmat([blocks], format=format, dtype=dtype)
    466 
    467 

/usr/local/lib/python3.6/dist-packages/scipy/sparse/construct.py in bmat(blocks, format, dtype)
    543     """
    544 
--> 545     blocks = np.asarray(blocks, dtype='object')
    546 
    547     if blocks.ndim != 2:

/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     83 
     84     """
---> 85     return array(a, dtype, copy=False, order=order)
     86 
     87 

ValueError: could not broadcast input array from shape (3,4) into shape (3)

但是如果我们首先将一个(甚至是第二个)转换为稀疏:

In [39]: sparse.hstack([np.ones((3,4)),sparse.coo_matrix(np.zeros((3,2)))])     
Out[39]: 
<3x6 sparse matrix of type '<class 'numpy.float64'>'
    with 12 stored elements in COOrdinate format>
In [40]: _.A                                                                    
Out[40]: 
array([[1., 1., 1., 1., 0., 0.],
       [1., 1., 1., 1., 0., 0.],
       [1., 1., 1., 1., 0., 0.]])

当然是连接两个密集数组的正确方法:

In [41]: np.hstack([np.ones((3,4)),np.zeros((3,2))])                            
Out[41]: 
array([[1., 1., 1., 1., 0., 0.],
       [1., 1., 1., 1., 0., 0.],
       [1., 1., 1., 1., 0., 0.]])

array(...,object) 错误有点晦涩;它的出现是因为两个数组都是密集的并且具有相同的第一维。这是 numpy 中的一个已知问题。由于 sparse.hstack 旨在用于稀疏矩阵,因此可以原谅其开发人员忽略此 numpy 误用。

===

sparse.vstack 确实适用于密集数组,形状如 (3,4) 和 (5,4),因为 np.array(..., object) 确实生成了有效的对象 dtype 数组。但是如果形状匹配,例如(3,4)和(3,4),hstackvstack都不行,但是报错信息和你的不一样。

In [66]: sparse.hstack((np.ones((3,2)),np.zeros((3,2))))                        
...
ValueError: blocks must be 2-D

所以我们需要认真对待文档。