Как сохранить порядок вставки в SciPy Sparse Matrix CSR_Matrix?

#python #scipy #sparse-matrix

#python #scipy #разреженная матрица

Вопрос:

Я бы хотел сохранить порядок вставки в 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 где индексы — это 2D-матрица индексов, затем сортируется как по индексам строк, так и по столбцам.

Комментарии:

1. ‘csr’ — сжатая матрица разреженных строк. Посмотрите на data, indices, indptr стиль входных данных, чтобы увидеть, как этот формат хранит массив. Данные должны быть отсортированы по строкам. Этот формат предназначен для эффективных вычислений, а не для хранения данных общего назначения.

2. Спасибо, я выяснил, что вставка по data, indices, indptr сохраняет порядок внутри строки (все еще сортируется по строке, но больше не по индексам столбцов). В то время как вставка по, data, indices где indices — 2D-матрица индексов, затем сортируется как по индексам строк, так и по столбцам. Это то, что мне было нужно, спасибо.

3. @narcissa просто в качестве предупреждения, есть несколько разреженных операций, которые могут сортировать индексы столбцов на месте. Полагаться на то, что они будут в порядке вставки, будет работать до тех пор, пока этого не произойдет.

4. Если эти массивы правильно отформатированы (dtype и т.д.), Они используются как есть при создании матрицы. Существует метод inplace sort , но я не думаю, что он обычно вызывается. Я не знаю, влияет ли сортировка (или нет) на производительность (например, для умножения матриц). Я согласен с @CJR, что не стоит рассчитывать на этот порядок. Разреженные матрицы, особенно csr , предназначены для операций линейной алгебры, а не для специализированного хранения данных.

5. @hpaulj Существует несколько функций mkl, которые сортируются без предупреждения при вызове, и я думаю, что пара решателей scipy также могла бы.

Ответ №1:

Формат CSR хранит данные в формате строк (путем выделения мест в непрерывном с памятью массиве данных, где начинается и заканчивается каждая строка). Нужная вам информация не существует в этом формате — часть сжатия заключается в ее удалении.

Если вам нужна эта информация о заказе, вы могли бы оставить ее в формате COO с оговоркой, что существуют операции, которые приводят к сортировке матриц COO без предупреждения. Возможно, было бы лучше хранить эту информацию явно, а не неявно (позволяют ли scipy sparse matrices использовать структуры в матрице данных?).