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

时间:2016-03-03 13:08:51

标签: python numpy matrix scipy sparse-matrix

Python中有没有办法对稀疏矩阵进行有效的增量更新?

 H = lil_matrix((n,m))
 for (i,j) in zip(A,B):
   h(i,j) += compute_something  

似乎这种构建稀疏矩阵的方法非常慢(lil_matrix是最快的稀疏矩阵类型)。

有没有办法(比如使用dict或其他类型的方法)有效地构建稀疏矩阵H?

3 个答案:

答案 0 :(得分:2)

https://stackoverflow.com/a/27771335/901925中,我探索增量矩阵分配。

如果您想更改值,则

loldok是推荐的格式。 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_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

答案 2 :(得分:0)

更快的方法是:

H_ij = compute_something_vectorized()
H = coo_matrix((H_ij, (A, B))).tocsr()

然后将重复坐标的数据相加,请参阅docs for coo_matrix

相关问题