[英]Efficient incremental sparse matrix in python / scipy / numpy
Python中有没有一种方法可以有效地更新稀疏矩阵?
H = lil_matrix((n,m))
for (i,j) in zip(A,B):
h(i,j) += compute_something
看起来这种构建稀疏矩阵的方法相当慢( lil_matrix
是最快的稀疏矩阵类型)。
有没有办法(例如使用dict或其他方法)有效地构建稀疏矩阵H?
在https://stackoverflow.com/a/27771335/901925中,我探索了增量矩阵分配。
如果您要更改值,则建议使用lol
和dok
格式。 csr
会向您发出效率警告,而coo
不允许coo
索引。
但是我还发现,与常规字典索引相比, dok
索引的速度较慢。 因此,对于许多更改,最好构建一个普通的字典(具有相同的元组索引),然后dok
构建dok
矩阵。
但是,如果您可以通过快速的numpy
向量运算来计算H
数据值,而不是进行迭代,则最好这样做,并从中构造稀疏矩阵(例如coo
格式)。 实际上,即使进行迭代,它也会更快:
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))
例如
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.]])
请注意,(1,2)值为4 + 5之和。 这是coo
转换为csr
的一部分。
在这种情况下,我可以用以下公式计算h
:
In [791]: A+B+np.arange(A.shape[0])
Out[791]: array([0, 4, 5, 6])
因此无需迭代。
不会,不要使用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
更快的方法是:
H_ij = compute_something_vectorized()
H = coo_matrix((H_ij, (A, B))).tocsr()
然后将重复坐标的数据相加,请参阅文档coo_matrix
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.