2017-02-14 226 views
0

我一直试图通过其行的向量和来划分python scipy稀疏矩阵。这里是我的代码scipy稀疏矩阵分裂

sparse_mat = bsr_matrix((l_data, (l_row, l_col)), dtype=float) 
sparse_mat = sparse_mat/(sparse_mat.sum(axis = 1)[:,None]) 

然而,它抛出一个错误,不管我如何努力也

sparse_mat = sparse_mat/(sparse_mat.sum(axis = 1)[:,None]) 
File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 381, in __div__ 
return self.__truediv__(other) 
File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 427, in __truediv__ 
raise NotImplementedError 
NotImplementedError 

任何与我要去的地方错误的想法?

+0

该部门调用true_division,这是一个元素明智的分工。这似乎没有被实施多个价值。所以,最有可能的结果是'(sparse_mat.sum(axis = 1)[:, None]'不是一个单一的数字。 – Dschoni

+0

@Dschoni是的,结果是一个向量,我的目标是将每个元素如果M = [[2,4],[1,2]],我想得到Ans = [[2/6,4/6],[1/3,2/3]]。 – uchman21

+0

你试过了吗?sparse_mat = sparse_mat *(1 /(sparse_mat.sum(axis = 1)[:, None]))'似乎稀疏矩阵的划分是问题。您可能还必须将除数转换为密集数组sparse_mat = sparse_mat *(1 /(sparse_mat.sum(axis = 1).toarray()[:,None]))' –

回答

3

您可以通过从行数和的倒数创建一个稀疏对角矩阵,然后将其与矩阵相乘来规避问题。在产品中,对角矩阵左移,矩阵右移。

例子:

>>> a 
array([[0, 9, 0, 0, 1, 0], 
     [2, 0, 5, 0, 0, 9], 
     [0, 2, 0, 0, 0, 0], 
     [2, 0, 0, 0, 0, 0], 
     [0, 9, 5, 3, 0, 7], 
     [1, 0, 0, 8, 9, 0]]) 
>>> b = sparse.bsr_matrix(a) 
>>> 
>>> c = sparse.diags(1/b.sum(axis=1).A.ravel()) 
>>> # on older scipy versions the offsets parameter (default 0) 
... # is a required argument, thus 
... # c = sparse.diags(1/b.sum(axis=1).A.ravel(), 0) 
... 
>>> a/a.sum(axis=1, keepdims=True) 
array([[ 0.  , 0.9  , 0.  , 0.  , 0.1  , 0.  ], 
     [ 0.125  , 0.  , 0.3125 , 0.  , 0.  , 0.5625 ], 
     [ 0.  , 1.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 1.  , 0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.375  , 0.20833333, 0.125  , 0.  , 0.29166667], 
     [ 0.05555556, 0.  , 0.  , 0.44444444, 0.5  , 0.  ]]) 
>>> (c @ b).todense() # on Python < 3.5 replace c @ b with c.dot(b) 
matrix([[ 0.  , 0.9  , 0.  , 0.  , 0.1  , 0.  ], 
     [ 0.125  , 0.  , 0.3125 , 0.  , 0.  , 0.5625 ], 
     [ 0.  , 1.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 1.  , 0.  , 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.375  , 0.20833333, 0.125  , 0.  , 0.29166667], 
     [ 0.05555556, 0.  , 0.  , 0.44444444, 0.5  , 0.  ]]) 
+0

我试过这个解决方案,但它给出了错误 elem_sum = csc_matrix((1/sparse_mat.sum(axis = -1).A.ravel(),numpy.arange(sparse_mat.shape [0]),numpy.arange (sparse_mat.shape [0] +1))) 文件“/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py”,第548行,总计 return spmatrix.sum(self, axis) 文件“/usr/lib/python2.7/dist-packages/scipy/sparse/base.py”,第629行,总计 raise ValueError(“axis out of bounds”) ValueError:axis out of bounds – uchman21

+0

@ uchman21奇怪的是,尝试'axis = 1',那么,这似乎在你的代码中工作。 –

+0

是的工作。然而,对于我来说,我需要使它像 c = sparse.diags(1/b.sum(axis = 1).A.ravel(),0)来指定它最终工作的主对角线。请添加到你的答案。 – uchman21

1

一些有趣的事情是怎么回事。执行元素分割没有问题。我不知道这是否是Py2问题。我正在使用Py3。

In [1022]: A=sparse.bsr_matrix([[2,4],[1,2]]) 
In [1023]: A 
Out[1023]: 
<2x2 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements (blocksize = 2x2) in Block Sparse Row format> 
In [1024]: A.A 
Out[1024]: 
array([[2, 4], 
     [1, 2]], dtype=int32) 
In [1025]: A.sum(axis=1) 
Out[1025]: 
matrix([[6], 
     [3]], dtype=int32) 
In [1026]: A/A.sum(axis=1) 
Out[1026]: 
matrix([[ 0.33333333, 0.66666667], 
     [ 0.33333333, 0.66666667]]) 

或尝试的其它示例:

In [1027]: b=sparse.bsr_matrix([[0, 9, 0, 0, 1, 0], 
     ...:  [2, 0, 5, 0, 0, 9], 
     ...:  [0, 2, 0, 0, 0, 0], 
     ...:  [2, 0, 0, 0, 0, 0], 
     ...:  [0, 9, 5, 3, 0, 7], 
     ...:  [1, 0, 0, 8, 9, 0]]) 
In [1028]: b 
Out[1028]: 
<6x6 sparse matrix of type '<class 'numpy.int32'>' 
    with 14 stored elements (blocksize = 1x1) in Block Sparse Row format> 
In [1029]: b.sum(axis=1) 
Out[1029]: 
matrix([[10], 
     [16], 
     [ 2], 
     [ 2], 
     [24], 
     [18]], dtype=int32) 
In [1030]: b/b.sum(axis=1) 
Out[1030]: 
matrix([[ 0.  , 0.9  , 0.  , 0.  , 0.1  , 0.  ], 
     [ 0.125  , 0.  , 0.3125 , 0.  , 0.  , 0.5625 ], 
.... 
     [ 0.05555556, 0.  , 0.  , 0.44444444, 0.5  ,  0.  ]]) 

此稀疏/密集的结果也是致密,其中作为c*bc是稀疏对角线)是稀疏的。

In [1039]: c*b 
Out[1039]: 
<6x6 sparse matrix of type '<class 'numpy.float64'>' 
    with 14 stored elements in Compressed Sparse Row format> 

稀疏和是一个稠密矩阵。它是2D的,所以不需要扩展它的尺寸。事实上,如果我尝试获得一个错误:

In [1031]: A/(A.sum(axis=1)[:,None]) 
.... 
ValueError: shape too large to be a matrix.