scipy.csr_matrix 造成的意外结果

unexpected outcome caused by scipy.csr_matrix

>>> import numpy as np
>>> from scipy.sparse import *
>>> x1 = np.eye(3, dtype=float)
>>> x2 = csr_matrix(x1, dtype=float, shape =x1.shape)
>>> assert x2.todense().any()==x1.any()  ## holds true
>>> w = np.ones((3,1))
>>> dw1 = w - x1[:,0]
>>> dw2 = w - x2[:,0]

这给了我

>>> print dw1
[[ 0.  1.  1.]
 [ 0.  1.  1.]
 [ 0.  1.  1.]]

>>> print dw2
[[ 0.]
 [ 1.]
 [ 1.]]

我的问题是为什么 dw1 和 dw2 不同?他们应该推迟,这是一个错误吗?非常感谢!

这是一个 slicing/indexing 问题。这里有问题的行是

w - x1[:, 0]

这与稀疏无关。您对 x1 进行了切片,获得了一个一维数组。当从 w 中减去它时,numpy 将这个数组广播回一个 3 x 3 矩阵(因为它等于两个项的列数),我猜这不是你想要的。

看起来您只需要包含 x1 的第一列的 子矩阵。这将是

w - x1[:, [0]]

返回

array([[ 0.],
       [ 1.],
       [ 1.]])

与另一个结果一致。

如果是稀疏矩阵,您会自动得到一个子矩阵(不是一维数组),因为它们的索引工作方式不同。

因为那些切片分别是1D2D-

In [23]: x1[:,0]
Out[23]: array([ 1.,  0.,  0.])

In [24]: x2[:,0].toarray()
Out[24]: 
array([[ 1.],
       [ 0.],
       [ 0.]])

In [29]: x1[:,0].ndim
Out[29]: 1

In [30]: x2[:,0].toarray().ndim
Out[30]: 2

此外,w是一个二维数组-

In [33]: w
Out[33]: 
array([[ 1.],
       [ 1.],
       [ 1.]])

In [34]: w.ndim
Out[34]: 2

因此,对于 broadcastingw 的减法是沿着 w 的不同轴执行的,即分别是第二轴和第一轴。