【发布时间】:2018-01-11 13:20:00
【问题描述】:
假设我有一个 scipy.sparse.csr_matrix 代表以下值
[[0 0 1 2 0 3 0 4]
[1 0 0 2 0 3 4 0]]
我想就地计算非零值的累积和,这会将数组更改为:
[[0 0 1 3 0 6 0 10]
[1 0 0 3 0 6 10 0]]
实际值不是 1, 2, 3, ...
每行中非零值的数量不可能相同。
如何快速做到这一点?
当前节目:
import scipy.sparse
import numpy as np
# sparse data
a = scipy.sparse.csr_matrix(
[[0,0,1,2,0,3,0,4],
[1,0,0,2,0,3,4,0]],
dtype=int)
# method
indptr = a.indptr
data = a.data
for i in range(a.shape[0]):
st = indptr[i]
en = indptr[i + 1]
np.cumsum(data[st:en], out=data[st:en])
# print result
print(a.todense())
结果:
[[ 0 0 1 3 0 6 0 10]
[ 1 0 0 3 0 6 10 0]]
【问题讨论】:
-
对于工作代码,您应该发布到codereview.stackexchange.com
-
关注 SO 的
numpy/scipy比关注 CR 的要多得多。 SO 上一直都在回答有关工作代码的速度问题,尤其是在代码包有些专业的情况下。 -
@r xu,您展示的内容看起来不错。逐行应用cumsum确实是唯一的方法。你对out的使用很聪明。有一个基于as strided的indptr迭代器可能会提高一点速度。
标签: python numpy scipy sum cumsum