繁体   English   中英

python / scipy / numpy中的有效增量式稀疏矩阵

[英]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中,我探索了增量矩阵分配。

如果您要更改值,则建议使用loldok格式。 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_matrixcsc_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM