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.]])
与另一个结果一致。
如果是稀疏矩阵,您会自动得到一个子矩阵(不是一维数组),因为它们的索引工作方式不同。
因为那些切片分别是1D
和2D
-
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
因此,对于 broadcasting
,w
的减法是沿着 w
的不同轴执行的,即分别是第二轴和第一轴。
>>> 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.]])
与另一个结果一致。
如果是稀疏矩阵,您会自动得到一个子矩阵(不是一维数组),因为它们的索引工作方式不同。
因为那些切片分别是1D
和2D
-
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
因此,对于 broadcasting
,w
的减法是沿着 w
的不同轴执行的,即分别是第二轴和第一轴。