Jak przekształcić numpy.matrix lub tablicę w scipy rzadką macierz

86

W przypadku macierzy rzadkich SciPy można użyć todense()lub, toarray()aby przekształcić w macierz lub tablicę NumPy. Jakie są funkcje odwrotne?

Szukałem, ale nie mam pojęcia, jakie słowa kluczowe powinny być trafne.

Płatek
źródło

Odpowiedzi:

127

Podczas inicjowania rzadkiej macierzy można przekazać tablicę numpy lub macierz jako argument. Na przykład w przypadku macierzy CSR możesz wykonać następujące czynności.

>>> 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
David Alber
źródło
2
A co z tablicami z wyższych wymiarów?
Nirmal
Otrzymuję błąd pamięci mojej matrycy (~ 25 000x25 000). Poza tym zużycie pamięci podskakuje jak szalone, kiedy aplikujęsparse.csr_matrix
Martin Thoma,
23

W scipy jest kilka rzadkich klas macierzy.

bsr_matrix (arg1 [, shape, dtype, copy, blockize]) Block Sparse Row matrix
coo_matrix (arg1 [, shape, dtype, copy]) Rzadka macierz w formacie COOrdinate.
csc_matrix (arg1 [, shape, dtype, copy]) Skompresowana rzadka macierz kolumn
csr_matrix (arg1 [, shape, dtype, copy]) Skompresowana rzadka macierz
wierszowa dia_matrix (arg1 [, shape, dtype, copy]) Rzadka macierz z pamięcią
DIAgonal dok_matrix (arg1 [, kształt, dtype, kopia]) Macierz rzadka oparta na słowniku kluczy.
lil_matrix (arg1 [, shape, dtype, copy]) Rzędowa lista połączona z wierszami macierz rzadka

Każdy z nich może dokonać konwersji.

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

Zobacz http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information .

cyborg
źródło
0

Jeśli chodzi o odwrotność, funkcja jest inv(A), ale nie polecam jej używania, ponieważ dla dużych macierzy jest bardzo kosztowna obliczeniowo i niestabilna. Zamiast tego powinieneś użyć przybliżenia do odwrotności, lub jeśli chcesz rozwiązać Ax = b, tak naprawdę nie potrzebujesz A -1 .

Fernando Bastos García
źródło
4
Pytanie dotyczy sposobu generowania scipy rzadkiej macierzy przy użyciu numpy macierzy / tablicy, a nie odwrotnej jako operacji na macierzy.
Virgil Ming
0

W Pythonie biblioteka Scipy może być używana do konwersji macierzy 2-D NumPy na macierz Sparse. Pakiet macierzy rzadkich SciPy 2-D dla danych numerycznych to scipy.sparse

Pakiet scipy.sparse zapewnia różne klasy do tworzenia następujących typów rzadkich macierzy z dwuwymiarowej macierzy:

  1. Blokuj macierz rzadkich wierszy
  2. Rzadka macierz w formacie COOrdinate.
  3. Skompresowana macierz rzadkich kolumn
  4. Skompresowana macierz rzadkich wierszy
  5. Rzadka macierz z pamięcią DIAgonal
  6. Macierz rzadka oparta na słowniku kluczy.
  7. Oparta na wierszach lista list rzadka macierz
  8. Ta klasa zapewnia klasę bazową dla wszystkich rzadkich macierzy.

Formaty CSR (Compressed Sparse Row) lub CSC (Compressed Sparse Column) obsługują efektywny dostęp i operacje macierzowe.

Przykładowy kod do konwersji macierzy Numpy na macierz skompresowanych rzadkich kolumn (CSC) i macierz skompresowanych rzadkich wierszy (CSR) przy użyciu klas 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

utwórz macierz Numpy 2-D

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))

Wydrukuj matrycę i inne szczegóły:

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'>

Konwersja macierzy A na reprezentację macierzy skompresowanych rzadkich wierszy przy użyciu klasy 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))

Dane wyjściowe instrukcji print:

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'>

Konwersja macierzy A do reprezentacji macierzy skompresowanych kolumn rzadkich przy użyciu klasy 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))

Dane wyjściowe instrukcji print:

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'>

Jak widać, rozmiar skompresowanych macierzy to 56 bajtów, a oryginalny rozmiar macierzy to 184 bajty.

Bardziej szczegółowe wyjaśnienia i przykłady kodów można znaleźć w tym artykule: https://limitlessdatascience.wordpress.com/2020/11/26/sparse-matrix-in-machine-learning/

Yogesh
źródło