使用非零元素的数量标准化scipy稀疏矩阵

时间:2018-03-13 19:07:46

标签: python numpy scipy sparse-matrix

我想将csr_matrix的每一行除以该行中非零项的数量。

例如:考虑一个csr_matrix A:

A = [[6, 0, 0, 4, 0], [3, 18, 0, 9, 0]]
Result = [[3, 0, 0, 2, 0], [1, 6, 0, 3, 0]]

最简单有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

Divakar提供了一种就地方法。我的试用版创建了一个新阵列。

from scipy import sparse
A = sparse.csr_matrix([[6, 0, 0, 4, 0], [3, 18, 0, 9, 0]])
A.multiply(1.0/(A != 0).sum(axis=1)) 

我们乘以每行中非零部分之和的倒数值。请注意,可能需要确保没有被零除错误。

正如Divakar所指出的那样:1.0需要1而不是A.multiply(1.0/...)才能与Python 2兼容。

答案 1 :(得分:2)

使用getnnz方法获取计数,然后复制并就地分割为使用data方法获得的展平视图 -

s = A.getnnz(axis=1)
A.data /= np.repeat(s, s)

Row Division in Scipy Sparse Matrix 's solution post : Approach #2的启发。

示例运行 -

In [15]: from scipy.sparse import csr_matrix

In [16]: A = csr_matrix([[6, 0, 0, 4, 0], [3, 18, 0, 9, 0]])

In [18]: s = A.getnnz(axis=1)
    ...: A.data /= np.repeat(s, s)

In [19]: A.toarray()
Out[19]: 
array([[3, 0, 0, 2, 0],
       [1, 6, 0, 3, 0]])

注意:要在Python2和3之间兼容,我们可能希望使用// -

A.data //=  ...