【问题标题】:Fast row operations with python sparse matrices使用 python 稀疏矩阵进行快速行操作
【发布时间】:2017-08-11 20:49:04
【问题描述】:

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

【问题讨论】:

  • AFAIK,每次向现有稀疏矩阵添加非零条目时,都需要复制整个矩阵(数组元素按顺序存储,此顺序需要用新的条目;还有编码矩阵变化所需的内存)。对于稀疏矩阵,加法总是很慢。如果矩阵太大而无法加载到内存中,我建议处理以可索引格式(如 hdf5)保存在硬盘上的密集矩阵。

标签: python matrix scipy sparse-matrix


【解决方案1】:

首先,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 搜索)

【讨论】:

  • 不幸的是,我的矩阵的两行通常不会具有相同的稀疏结构。感谢您向我推荐其他链接。我不知道他们。
  • 对我来说,(海报)这个解决方案有效:将矩阵表示为 2 级嵌套字典,其中第 i 行、第 j 列通过 d[i][j] 访问。添加两行然后将 d[i1] '添加'到 d[i2],这是在讨论here
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 2023-03-25
  • 2017-12-05
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2012-01-10
相关资源
最近更新 更多