Python 如何在SciPy稀疏矩阵CSR_矩阵中保持插入顺序?

Python 如何在SciPy稀疏矩阵CSR_矩阵中保持插入顺序?,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,我想保留插入SciPy csr_矩阵的顺序,但它似乎总是按行排序,然后索引: >>> 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)

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

>>> 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:发现使用
数据、索引、indptr
方法插入可以保留行内的顺序(仍然按行排序,但不再按列索引排序)。而按
数据插入,索引是2D索引矩阵的索引则按行和列索引进行排序。

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


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

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