CSR scipy-матрица не обновляется после обновления своих значений

У меня есть следующий код в python:

import numpy as np from scipy.sparse import csr_matrix M = csr_matrix(np.ones([2, 2],dtype=np.int32)) print(M) print(M.data.shape) for i in range(np.shape(mat)[0]): for j in range(np.shape(mat)[1]): if i==j: M[i,j] = 0 print(M) print(M.data.shape) 

Вывод первых двух отпечатков:

  (0, 0) 1 (0, 1) 1 (1, 0) 1 (1, 1) 1 (4,) 

Код меняет значение одного и того же индекса (i == j) и устанавливает значение в ноль. После выполнения циклов вывод двух последних отпечатков:

  (0, 0) 0 (0, 1) 1 (1, 0) 1 (1, 1) 0 (4,) 

Если я правильно понимаю понятие разреженных матриц, это не должно быть так. Он не должен показывать мне нулевые значения, а вывод последних двух отпечатков должен быть следующим:

  (0, 1) 1 (1, 0) 1 (2,) 

У кого-нибудь есть объяснение? Я делаю что-то неправильно?

Да, вы пытаетесь изменить элементы матрицы один за другим. 🙂

Хорошо, это работает так, хотя если вы изменили ситуацию другим способом (установив 0 на ненулевой), вы получите предупреждение об эффективности.

Чтобы сохранить ваши изменения быстро, он только изменяет значение в массиве M.data и не пересчитывает индексы. Вы должны вызвать отдельный метод csr_matrix.eliminate_zeros для очистки матрицы. Чтобы получить максимальную скорость, вызовите это один раз в конце цикла.

Существует метод csr_matrix.setdiag, который позволяет вам задавать всю диагональ одним вызовом. Он по-прежнему нуждается в очистке.

 In [1633]: M=sparse.csr_matrix(np.arange(9).reshape(3,3)) In [1634]: M Out[1634]: <3x3 sparse matrix of type '<class 'numpy.int32'>' with 8 stored elements in Compressed Sparse Row format> In [1635]: MA Out[1635]: array([[0, 1, 2], [3, 4, 5], [6, 7, 8]], dtype=int32) In [1636]: M.setdiag(0) /usr/local/lib/python3.5/dist-packages/scipy/sparse/compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient. SparseEfficiencyWarning) In [1637]: M Out[1637]: <3x3 sparse matrix of type '<class 'numpy.int32'>' with 9 stored elements in Compressed Sparse Row format> In [1638]: MA Out[1638]: array([[0, 1, 2], [3, 0, 5], [6, 7, 0]]) In [1639]: M.data Out[1639]: array([0, 1, 2, 3, 0, 5, 6, 7, 0]) In [1640]: M.eliminate_zeros() In [1641]: M Out[1641]: <3x3 sparse matrix of type '<class 'numpy.int32'>' with 6 stored elements in Compressed Sparse Row format> In [1642]: M.data Out[1642]: array([1, 2, 3, 5, 6, 7])