我有一个以csr_matrix格式表示的稀疏矩阵。对于每一行,我需要从非零元素中减去行均值。这些均值必须在行的非零元素数量上计算(而不是行的长度)。
我找到了一种快速计算行均值的方法,代码如下:
问题在于更新部分。我需要一种快速的方法来完成这个任务。 实际上,我正在将M转换为lil_matrix,并以这种方式执行更新。
# 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