使用python稀疏矩阵进行快速行操作

时间:2017-03-20 14:15:12

标签: python matrix scipy sparse-matrix

我在python中有一个大的稀疏矩阵,并希望对它执行许多基本行操作。也就是说,将一行的倍数添加到另一行。这样做最有效的方法是什么?使用lil矩阵可以进行基本行操作,但速度非常慢。 csc和csr矩阵不支持这些操作。

1 个答案:

答案 0 :(得分:0)

首先,MCVexample可以帮助解决这个问题。我只能推测你的行操作。

一个基本问题 - 稀疏结构的行是否不同?以lil为例。如果2行具有相同的rows列表,那么您的数学运算可以直接使用data列表。如果rows与数学不同,则会变得更复杂,因为您必须更改两个列表。

lilcsr都支持按行

进行索引
In [7]: M=sparse.rand(10,10,.3)
In [8]: Mr=M.tocsr()
In [9]: Ml=M.tolil()

是的,如果您通过添加另一行来更改行,则csr会发出警告:

In [17]: Ml[2,:] += Ml[1,:]
In [18]: Mr[2,:] += Mr[1,:]
...
  SparseEfficiencyWarning)

但是lil数学实际上使用了csr中介。 lil行表示为列表,而不是数组。

In [14]: Ml[1,:]+Ml[2,:]
Out[14]: 
<1x10 sparse matrix of type '<class 'numpy.float64'>'
    with 5 stored elements in Compressed Sparse Row format>

索引矩阵运算很慢,特别是与密集阵列等效运算相比。但他们会为你处理很多小细节。

我在其他SO答案中探讨了行操作。当我更好地了解你想要做什么时,我会搜索那些。

总的来说,没有灵丹妙药,特别是如果你改变稀疏性。 scipy sparse不是快速行计算的最佳工具。

scipy: Adding a sparse vector to a specific row of a sparse matrix - 这个很接近,我很想把这个问题标记为副本。

Extremely slow sum row operation in Sparse LIL matrix in Python

(更多在'user:901925 [scipy] rows'的SO搜索中)