如何在Scipy稀疏矩阵(csr_matrix和csc_matrix)中获取每行和每列的总和?

6

我有一个非常大的Scipy稀疏矩阵 (CSR_MATRIX)。我想知道如何计算矩阵每行和每列的值之和。

我已经有一段代码可以完成同样的操作,但它使用的是CSC_MATRIX。这两者在求行列和方面有什么不同吗?

我想也许我可以得到一个快速的回复,其他人也可以用得上,否则我可以自己测试。

from scipy.sparse import *
from scipy import *
row = array([0,0,1,2,2,2])
col = array([0,2,2,0,1,2])
data = array([1,2,3,4,5,6])
csr_matrix( (data,(row,col)), shape=(3,3) ).todense()
rowsums = []
colsums = []
#compute rowsums and colsums

所以rowsums应该是[3, 3, 15]colsum应该是[5, 5, 11]

我知道可以使用matrix.getrow(i)和matrix.getcol(i)来获取每行和每列,并使用sum()函数来获取总和,但我的关注点是性能。我需要一个更有效率的解决方案。

1个回答

14

使用sum方法的axis参数:

In [2]: row = array([0,0,1,2,2,2])

In [3]: col = array([0,2,2,0,1,2])

In [4]: data = array([1,2,3,4,5,6])

In [5]: a = csr_matrix((data, (row, col)), shape=(3,3))

In [6]: a.A
Out[6]: 
array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

In [7]: a.sum(axis=0)  # sum the columns
Out[7]: matrix([[ 5,  5, 11]])

In [8]: a.sum(axis=1)  # sum the rows
Out[8]: 
matrix([[ 3],
        [ 3],
        [15]])

非常感谢您的大力帮助。我测试了您的解决方案,效果非常棒。 - alenrooni
@Warren Weckesser,能否打印出带有行名称的a.sum(axis=1) - Vlad Fedo
@VladFedo,在SciPy稀疏矩阵中,行没有名称。 - Warren Weckesser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接