我在python中有一个大的稀疏矩阵,并希望对它执行许多基本行操作。也就是说,将一行的倍数添加到另一行。这样做最有效的方法是什么?使用lil矩阵可以进行基本行操作,但速度非常慢。 csc和csr矩阵不支持这些操作。
答案 0 :(得分:0)
首先,MCVexample可以帮助解决这个问题。我只能推测你的行操作。
一个基本问题 - 稀疏结构的行是否不同?以lil
为例。如果2行具有相同的rows
列表,那么您的数学运算可以直接使用data
列表。如果rows
与数学不同,则会变得更复杂,因为您必须更改两个列表。
lil
和csr
都支持按行
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搜索中)