【发布时间】: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