在Python中,是否有一种有效的增量更新稀疏矩阵的方法?
H = lil_matrix((n,m))
for (i,j) in zip(A,B):
h(i,j) += compute_something
看起来这种方法构建稀疏矩阵速度相对较慢(lil_matrix
是最适合的稀疏矩阵类型)。
是否有一种高效构建稀疏矩阵 H 的方法(如使用字典或其他方式)?
在Python中,是否有一种有效的增量更新稀疏矩阵的方法?
H = lil_matrix((n,m))
for (i,j) in zip(A,B):
h(i,j) += compute_something
看起来这种方法构建稀疏矩阵速度相对较慢(lil_matrix
是最适合的稀疏矩阵类型)。
是否有一种高效构建稀疏矩阵 H 的方法(如使用字典或其他方式)?
在https://dev59.com/Zl4c5IYBdhLWcg3wj7F6#27771335中,我介绍了增量矩阵赋值。
lol
和dok
是如果您想更改值的推荐格式。 csr
将为您提供效率警告,并且coo
不允许索引。
但我也发现与常规字典索引相比,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))
e.g.
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.]])
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
文档。
H
、A
和B
的大小是多少? - Cleb