使用非零元素的数量对 scipy 稀疏矩阵进行归一化

use*_*291 1 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]]
Run Code Online (Sandbox Code Playgroud)

什么是最短和有效的方法呢?

Div*_*kar 5

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

s = A.getnnz(axis=1)
A.data /= np.repeat(s, s)
Run Code Online (Sandbox Code Playgroud)

灵感来自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]])
Run Code Online (Sandbox Code Playgroud)

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

A.data //=  ...
Run Code Online (Sandbox Code Playgroud)