Python中有没有办法对稀疏矩阵进行有效的增量更新?
H = lil_matrix((n,m))
for (i,j) in zip(A,B):
h(i,j) += compute_something
似乎这种构建稀疏矩阵的方法非常慢(lil_matrix
是最快的稀疏矩阵类型)。
有没有办法(比如使用dict或其他类型的方法)有效地构建稀疏矩阵H?
答案 0 :(得分:2)
在https://stackoverflow.com/a/27771335/901925中,我探索增量矩阵分配。
如果您想更改值,则 lol
和dok
是推荐的格式。 csr
会为您提供效率警告,coo
不允许编制索引。
但我也发现dok
索引与常规字典索引相比较慢。因此,对于许多更改,最好构建一个普通字典(使用相同的元组索引),并从中构建dok
矩阵。
但是,如果您可以使用快速H
向量运算来计算numpy
数据值,而不是迭代,则最好这样做,并从中构造稀疏矩阵(例如{{ 1}}格式)。实际上,即使使用迭代,这也会更快:
coo
e.g。
h = np.zeros(A.shape)
for k, (i,j) in enumerate(zip(A,B)):
h[k] = compute_something
H = sparse.coo_matrix((h, (A, B)), shape=(n,m))
注意(1,2)值是4 + 5的总和。这是In [780]: A=np.array([0,1,1,2]); B=np.array([0,2,2,1])
In [781]: h=np.zeros(A.shape)
In [782]: for k, (i,j) in enumerate(zip(A,B)):
h[k] = i+j+k
.....:
In [783]: h
Out[783]: array([ 0., 4., 5., 6.])
In [784]: M=sparse.coo_matrix((h,(A,B)),shape=(4,4))
In [785]: M
Out[785]:
<4x4 sparse matrix of type '<class 'numpy.float64'>'
with 4 stored elements in COOrdinate format>
In [786]: M.A
Out[786]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 9., 0.],
[ 0., 6., 0., 0.],
[ 0., 0., 0., 0.]])
到coo
转化的一部分。
在这种情况下,我可以使用:
计算csr
h
所以不需要迭代。
答案 1 :(得分:1)
不,请不要使用csr_matrix
或csc_matrix
,因为如果逐步构建它们,它们将比lil_matrix
更慢。基于密钥的稀疏矩阵字典正是您正在寻找的
from scipy.sparse import dok_matrix
S = dok_matrix((5, 5), dtype=np.float32)
for i in range(5):
for j in range(5):
S[i,j] = i+j # Update elements
答案 2 :(得分:0)
更快的方法是:
H_ij = compute_something_vectorized()
H = coo_matrix((H_ij, (A, B))).tocsr()
然后将重复坐标的数据相加,请参阅docs for coo_matrix
。