【问题标题】:How to preserve order of insertion in SciPy Sparse Matrix CSR_Matrix?如何在 SciPy 稀疏矩阵 CSR_Matrix 中保留插入顺序?
【发布时间】:2020-09-09 02:13:33
【问题描述】:

我想保留插入 SciPy csr_matrix 的顺序,但它似乎总是先按行排序,然后按索引:

>>> from scipy.sparse import csr_matrix
>>> x = csr_matrix(([1,2,3],[[3,2,1],[5,2,1]]))
>>> print(x)
  (1, 1)    3
  (2, 2)    2
  (3, 5)    1

无论如何要保持原来的排序?我想要什么:

  (3, 5)    1
  (2, 2)    2
  (1, 1)    3

ETA:发现使用data, indices, indptr 方法插入会保留行内的顺序(仍然按行排序,但不再按列索引排序)。而通过data, indices 插入,其中索引是一个二维索引矩阵,然后按行索引和列索引排序。

【问题讨论】:

  • 'csr' - 压缩稀疏行矩阵。查看data, indices, indptr 输入样式以了解此格式如何存储数组。数据必须按行排序。这种格式是为高效计算而设计的,而不是作为某种通用数据存储。
  • 谢谢,我发现由data, indices, indptr 插入会保留行内的顺序(仍然按行排序,但不再按列索引排序)。而通过data, indices 插入,其中indices 是一个二维索引矩阵,然后按行索引和列索引排序。这正是我所需要的,谢谢。
  • @narcissa 只是作为一个警告,有几个稀疏操作可以就地对列索引进行排序。依靠它们按插入顺序进行操作将一直有效,直到无效为止。
  • 如果这些数组的格式正确(dtype 等),它们将按原样用于创建矩阵。有一个就地 sort 方法,但我认为通常不会调用它。我不知道排序(或不排序)是否会影响性能(例如矩阵乘法)。我同意@CJR 的观点,指望这个订单不是一个好主意。稀疏矩阵,尤其是csr,是为线性代数运算设计的,而不是专门的数据存储。
  • @hpaulj 有几个 mkl 函数在调用时会在没有警告的情况下进行排序,我认为几个 scipy 求解器也可以。

标签: python scipy sparse-matrix


【解决方案1】:

CSR 格式以逐行格式存储数据(通过标记内存连续数据数组中每行开始和结束的位置)。您想要的信息在该格式中不存在 - 压缩的一部分是删除它。

如果您需要该排序信息,您可以将其保留为 COO 格式,但需要注意的是,有些操作会导致 COO 矩阵在没有警告的情况下进行排序。最好是显式存储该信息而不是隐式存储(scipy 稀疏矩阵是否允许您在数据矩阵中使用结构?)。

【讨论】:

    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2017-03-26
    • 2017-03-31
    • 2023-04-10
    相关资源
    最近更新 更多