python 稀疏矩阵的快速行操作
Fast row operations with python sparse matrices
我在 python 中有一个很大的稀疏矩阵,想对其执行许多基本的行运算。即,将一行的倍数添加到另一行。最有效的方法是什么?使用 lil 矩阵可以进行基本的行操作,但速度非常慢。 csc 和 csr 矩阵不支持这些操作。
首先,一个 MCV 示例会对问题有很大帮助。我只能推测你的行操作。
一个基本问题 - 行的稀疏结构是否不同?以 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 - 这个问题非常接近,我很想将这个问题标记为重复。
(更多内容在 'user:901925 [scipy] rows'
上的 SO 搜索中)
我在 python 中有一个很大的稀疏矩阵,想对其执行许多基本的行运算。即,将一行的倍数添加到另一行。最有效的方法是什么?使用 lil 矩阵可以进行基本的行操作,但速度非常慢。 csc 和 csr 矩阵不支持这些操作。
首先,一个 MCV 示例会对问题有很大帮助。我只能推测你的行操作。
一个基本问题 - 行的稀疏结构是否不同?以 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 - 这个问题非常接近,我很想将这个问题标记为重复。
(更多内容在 'user:901925 [scipy] rows'
上的 SO 搜索中)