Как преобразовать numpy.matrix или array в scipy sparse matrix

86

Для разреженной матрицы SciPy можно использовать todense() или toarray()для преобразования в матрицу или массив NumPy. Какие функции делают обратное?

Я искал, но понятия не имел, какие ключевые слова должны быть правильными.

Хлопья
источник

Ответы:

127

Вы можете передать массив или матрицу numpy в качестве аргумента при инициализации разреженной матрицы. Например, для матрицы CSR вы можете сделать следующее.

>>> import numpy as np
>>> from scipy import sparse
>>> A = np.array([[1,2,0],[0,0,3],[1,0,4]])
>>> B = np.matrix([[1,2,0],[0,0,3],[1,0,4]])

>>> A
array([[1, 2, 0],
       [0, 0, 3],
       [1, 0, 4]])

>>> sA = sparse.csr_matrix(A)   # Here's the initialization of the sparse matrix.
>>> sB = sparse.csr_matrix(B)

>>> sA
<3x3 sparse matrix of type '<type 'numpy.int32'>'
        with 5 stored elements in Compressed Sparse Row format>

>>> print sA
  (0, 0)        1
  (0, 1)        2
  (1, 2)        3
  (2, 0)        1
  (2, 2)        4
Дэвид Альбер
источник
2
А как насчет многомерных массивов?
Nirmal
У меня ошибка памяти для моей матрицы (~ 25000x25000). Кроме того, когда я sparse.csr_matrix
Мартин Тома,
23

В scipy есть несколько классов разреженных матриц.

bsr_matrix (arg1 [, shape, dtype, copy, blockize]) Блочная матрица разреженных
строк coo_matrix (arg1 [, shape, dtype, copy]) Разреженная матрица в формате COOrdinate.
csc_matrix (arg1 [, shape, dtype, copy])
Сжатая матрица разреженных столбцов csr_matrix (arg1 [, shape, dtype, copy])
Сжатая матрица разреженных строк dia_matrix (arg1 [, shape, dtype, copy]) Разреженная матрица с DIAgonal хранилищем
dok_matrix (arg1 [, shape, dtype, copy]) Разреженная матрица на основе словаря ключей.
lil_matrix (arg1 [, shape, dtype, copy]) Разреженная матрица связанного списка на основе строк

Любой из них может сделать преобразование.

import numpy as np
from scipy import sparse
a=np.array([[1,0,1],[0,0,1]])
b=sparse.csr_matrix(a)
print(b)

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

См. Http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information .

киборг
источник
0

Что касается инверсии, функция есть inv(A), но я не рекомендую ее использовать, так как для больших матриц это очень затратно в вычислительном отношении и нестабильно. Вместо этого вы должны использовать приближение к обратному, или, если вы хотите решить Ax = b, вам действительно не нужно A -1 .

Фернандо Бастос Гарсия
источник
4
Вопрос спрашивает, как сгенерировать scipy разреженную матрицу, используя матрицу / массив numpy, а не обратную матрицу.
Вирджил Мин
0

В Python библиотеку Scipy можно использовать для преобразования двумерной матрицы NumPy в матрицу Sparse. Пакет SciPy 2-D разреженной матрицы для числовых данных - scipy.sparse

Пакет scipy.sparse предоставляет различные классы для создания следующих типов разреженных матриц из 2-мерной матрицы:

  1. Блокировать матрицу разреженных строк
  2. Разреженная матрица в формате COOrdinate.
  3. Сжатая матрица разреженных столбцов
  4. Сжатая матрица разреженных строк
  5. Разреженная матрица с DIAgonal хранилищем
  6. Разреженная матрица на основе словаря ключей.
  7. Построчный список списков разреженная матрица
  8. Этот класс предоставляет базовый класс для всех разреженных матриц.

Форматы CSR (сжатая разреженная строка) или CSC (сжатый разреженный столбец) поддерживают эффективный доступ и матричные операции.

Пример кода для преобразования матрицы Numpy в матрицу сжатых разреженных столбцов (CSC) и матрицу сжатых разреженных строк (CSR) с использованием классов Scipy:

import sys                 # Return the size of an object in bytes
import numpy as np         # To create 2 dimentional matrix
from scipy.sparse import csr_matrix, csc_matrix 
# csr_matrix: used to create compressed sparse row matrix from Matrix
# csc_matrix: used to create compressed sparse column matrix from Matrix

создать двумерную матрицу Numpy

A = np.array([[1, 0, 0, 0, 0, 0],\
              [0, 0, 2, 0, 0, 1],\
              [0, 0, 0, 2, 0, 0]])
print("Dense matrix representation: \n", A)
print("Memory utilised (bytes): ", sys.getsizeof(A))
print("Type of the object", type(A))

Распечатайте матрицу и другие детали:

Dense matrix representation: 
 [[1 0 0 0 0 0]
 [0 0 2 0 0 1]
 [0 0 0 2 0 0]]
Memory utilised (bytes):  184
Type of the object <class 'numpy.ndarray'>

Преобразование матрицы A в представление сжатой разреженной матрицы строк с использованием класса csr_matrix:

S = csr_matrix(A)
print("Sparse 'row' matrix: \n",S)
print("Memory utilised (bytes): ", sys.getsizeof(S))
print("Type of the object", type(S))

Вывод операторов печати:

Sparse 'row' matrix:
(0, 0) 1
(1, 2) 2
(1, 5) 1
(2, 3) 2
Memory utilised (bytes): 56
Type of the object: <class 'scipy.sparse.csr.csc_matrix'>

Преобразование матрицы A в представление матрицы сжатых разреженных столбцов с использованием класса csc_matrix:

S = csc_matrix(A)
print("Sparse 'column' matrix: \n",S)
print("Memory utilised (bytes): ", sys.getsizeof(S))
print("Type of the object", type(S))

Вывод операторов печати:

Sparse 'column' matrix:
(0, 0) 1
(1, 2) 2
(2, 3) 2
(1, 5) 1
Memory utilised (bytes): 56
Type of the object: <class 'scipy.sparse.csc.csc_matrix'>

Как видно, размер сжатых матриц составляет 56 байтов, а размер исходной матрицы - 184 байта.

Более подробное объяснение и примеры кода см. В этой статье: https://limitlessdatascience.wordpress.com/2020/11/26/sparse-matrix-in-machine-learning/

Йогеш
источник