Создание сжатой разреженной матрицы (CSR- матрицы) с помощью SciPy


Сжатая разреженная матрица — это более компактное представление матрицы с подавляющим количеством нулевых элементов. Представьте, что вы работаете с матрицей A, строки которой — это посетители городской библиотеки, а столбцы — это книги, хранящиеся в библиотеке. Если пользователь i прочитал книгу j, то в ячейке A[i, j] будет находиться оценка, которую посетитель i поставил книге j после прочтения. В остальных ячейках будут расположены нули. Несомненно, матрица A будет содержать тысячи строк и столбцов с явным преобладанием нулевых значений. Такая матрица называется разреженной. И оперировать такой огромной матрицей нерационально с точки зрения вычислительной экономии. Тем более, что предложенный SciPy функционал позволяет в разы сжимать матрицы такого рода, сохраняя информацию только о ненулевых элементах.

Пример сжатия разреженной матрицы CSR

В качестве примера создадим разреженную матрицу 5×10, то есть матрицу с подавляющим количеством нулей, и получим сжатую разреженную матрицу CSR с помощью метода csr_matrix() из пакета sparse библиотеки SciPy:

import numpy as np
from scipy import sparse

# Это разреженная матрица 5x10:
A = np.array([[0, 3, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 5, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 7]])

# сожмем разреженную матрицу A:
csr_A = sparse.csr_matrix(A)

print('Сжатая разреженная матрица:')
print(csr_A)

Вывод на экран:

Сжатая разреженная матрица:
   (0, 1)        3
   (2, 4)        5
   (4, 9)        7 

Пояснения по коду:

В приведенном выше примере исходная матрица A состоит из 5 строк и 10 столбцов ( A.shape = (5, 10)). При этом только 3 элемента отличны от нуля. Эти элементы находятся :

  • в нулевой строке, первом столбце (A[0, 1] = 3);
  • во второй строке, 4 столбце (A[2, 4] = 5);
  • в четвертой строке, 10 столбце (A[4, 10] = 7).

Для создания сжатой разреженной матрицы из исходной матрицы A мы импортировали пакет sparse из библиотеки SciPy и вызвали метод csr_matrix() для матрицы A.

Полученная в результате разреженная матрица имеет вид:

   (0, 1)        3
   (2, 4)        5
   (4, 9)        7 

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

(индекс_строки, индекс_столбца) ненулевое_значение

Сжатые разреженные матрицы хранят только ненулевые значения, подразумевая, что все остальные элементы — это нули. Таким образом, достигается экономия вычислительных ресурсов. Подобные преобразования широко используются в машинном обучении, позволяя эффективно решать задачи с разреженными данными.

Добавить комментарий