2016-12-29 41 views
1
>>> 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] 

意想不到的结局,给了我造成scipy.csr_matrix

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

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

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

+0

'x2'是一个稀疏*矩阵*,其行为与密集矩阵非常相似, 'np.matrix(X1)'。这里'x2 [:,0]'是(3,1)矩阵。 – hpaulj

回答

1

这是一个切片/索引问题。这里有问题的线是

w - x1[:, 0] 

这与稀疏无关。你已经切片x1,获得一维数组。当它从w中减去时,numpy将这个数组重新排列成一个3乘3的矩阵(因为它等于两个项的列数),我猜这不是你想要的。

看起来你只是想要子文件组成的第一列x1。这将是

w - x1[:, [0]] 

返回

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

与其他结果一致。

在稀疏矩阵的情况下,您会自动获得一个子矩阵(不是一维数组),因为索引对这些矩阵的工作方式不同。

+0

w - x1 [:,[0]]解决了我的问题,谢谢! – Shockley

2

这是因为那些切片分别为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是2D阵列 -

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

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

所以,用broadcastingw的减法沿不同的轴进行w分别为第二轴和第一轴。