我想将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]]
最简单有效的方法是什么?
答案 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 //= ...