本文介绍了高效行标准化矩阵的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要一种行标准化稀疏矩阵的有效方法.
I need an efficient way to row standardize a sparse matrix.
给予
W = matrix([[0, 1, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 0, 1, 0, 1, 0, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 0, 1, 0]])
row_sums = W.sum(1)
我需要生产...
W2 = matrix([[0. , 0.5 , 0. , 0.5 , 0. , 0. , 0. , 0. , 0. ],
[0.33, 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0. ],
[0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. , 0. , 0. ],
[0.33, 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0. ],
[0. , 0.25, 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. ],
[0. , 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0.33],
[0. , 0. , 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. ],
[0. , 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0.33],
[0. , 0. , 0. , 0. , 0. , 0.5 , 0. , 0.5 , 0. ]])
在哪里
for i in range(9):
W2[i] = W[i]/row_sums[i]
我想找到一种无需循环(即向量化)并使用Scipy.sparse矩阵的方法. W可能会大到1000万x 1000万.
I'd like to find a way to do this without loops (i.e. Vectorized) and using Scipy.sparse matrices. W could be as large at 10mil x 10mil.
推荐答案
带有一些矩阵代数
>>> cc
<9x9 sparse matrix of type '<type 'numpy.int32'>'
with 24 stored elements in Compressed Sparse Row format>
>>> ccd = sparse.spdiags(1./cc.sum(1).T, 0, *cc.shape)
>>> ccn = ccd * cc
>>> np.round(ccn.todense(), 2)
array([[ 0. , 0.5 , 0. , 0.5 , 0. , 0. , 0. , 0. , 0. ],
[ 0.33, 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0. ],
[ 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. , 0. , 0. ],
[ 0.33, 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0. ],
[ 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. , 0.25, 0. ],
[ 0. , 0. , 0.33, 0. , 0.33, 0. , 0. , 0. , 0.33],
[ 0. , 0. , 0. , 0.5 , 0. , 0. , 0. , 0.5 , 0. ],
[ 0. , 0. , 0. , 0. , 0.33, 0. , 0.33, 0. , 0.33],
[ 0. , 0. , 0. , 0. , 0. , 0.5 , 0. , 0.5 , 0. ]])
>>> ccn
<9x9 sparse matrix of type '<type 'numpy.float64'>'
with 24 stored elements in Compressed Sparse Row format>
这篇关于高效行标准化矩阵的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!