我有一个csr_matrix格式的稀疏矩阵。对于每一行我需要从非零元素中减去行平均值。必须根据行的非零元素的数量(而不是行的长度)计算均值。 我发现了一个快速的方法来计算该行指用下面的代码:scipy.sparse矩阵:将行平均值减去非零元素
# M is a csr_matrix
sums = np.squeeze(np.asarray(M.sum(1))) # sum of the nonzero elements, for each row
counts = np.diff(M.tocsr().indptr) # count of the nonzero elements, for each row
# for the i-th row the mean is just sums[i]/float(counts[i])
的问题是更新的一部分。我需要一个快速的方法来做到这一点。 其实我在做什么是用这种方式来改造一个m lil_matrix和执行更新:
M = M.tolil()
for i in xrange(len(sums)):
for j in M.getrow(i).nonzero()[1]:
M[i, j] -= sums[i]/float(counts[i])
这是缓慢的。任何建议更快的解决方案?
我试图复制行意味着使用'np.repeat'和'counts',并直接从'M.data'数组。 – hpaulj