Сжатая разреженная матрица — это более компактное представление матрицы с подавляющим количеством нулевых элементов. Представьте, что вы работаете с матрицей 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 хранит кортеж с номерами сток и столбцов ненулевых элементов и соответствующих им значений:
(индекс_строки, индекс_столбца) ненулевое_значение
Сжатые разреженные матрицы хранят только ненулевые значения, подразумевая, что все остальные элементы — это нули. Таким образом, достигается экономия вычислительных ресурсов. Подобные преобразования широко используются в машинном обучении, позволяя эффективно решать задачи с разреженными данными.
Фанаты BIG DATЫ — наш Телеграм-канал для всех увлеченных изучением Python, Data Science, ML, нейросетями и т.д. Присоединяйтесь, вместе веселее! 😉