Skip to main content
 首页 » 编程设计

python之scipy 稀疏矩阵除法

2025年05月04日12bonelee

我一直在尝试将 python 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 

有人知道我哪里出错了吗?

请您参考如下方法:

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

例子:

>>> 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.        ]])