So transformieren Sie numpy.matrix oder Array in eine spärliche Matrix

85

Für eine SciPy-Sparse-Matrix kann eine NumPy-Matrix oder ein Array verwendet todense()oder toarray()transformiert werden. Was sind die Funktionen, um das Inverse zu tun?

Ich habe gesucht, aber keine Ahnung, welche Keywords der richtige Treffer sein sollten.

Flocke
quelle

Antworten:

124

Sie können ein numpy-Array oder eine Matrix als Argument übergeben, wenn Sie eine Matrix mit geringer Dichte initialisieren. Für eine CSR-Matrix können Sie beispielsweise Folgendes tun.

>>> 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
quelle
2
Was ist mit höherdimensionalen Arrays?
Nirmal
Ich erhalte einen Speicherfehler für meine Matrix (~ 25.000 x 25.000). Auch der Speicherverbrauch springt wie verrückt, wenn ich mich bewerbesparse.csr_matrix
Martin Thoma
23

Es gibt mehrere spärliche Matrixklassen in scipy.

bsr_matrix (arg1 [, Form, Typ, Kopie, Blockgröße]) Block Sparse Row Matrix
coo_matrix (arg1 [, Form, Typ, Kopie]) Eine spärliche Matrix im COOrdinate-Format.
csc_matrix (arg1 [, Form, Typ, Kopie]) Komprimierte Sparse-
Spaltenmatrix csr_matrix (arg1 [, Form, D-Typ, Kopie]) Komprimierte Sparse-Zeilenmatrix
dia_matrix (arg1 [, Form, D-Typ, Kopie]) Sparse-Matrix mit DIAgonal-Speicher
dok_matrix (arg1 [, Form, Typ, Kopie]) Dictionary Of Keys-basierte Sparse-Matrix.
lil_matrix (arg1 [, Form, Typ, Kopie]) Zeilenbasierte Sparse-Matrix für verknüpfte Listen

Jeder von ihnen kann die Konvertierung durchführen.

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

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

Cyborg
quelle
0

Die Umkehrung ist die Funktion inv(A), aber ich werde sie nicht empfehlen, da sie für große Matrizen sehr rechenintensiv und instabil ist. Stattdessen sollten Sie eine Annäherung an die Umkehrung verwenden, oder wenn Sie Ax = b lösen möchten, benötigen Sie A -1 nicht wirklich .

Fernando Bastos García
quelle
4
In der Frage wird gefragt, wie eine Scipy-Sparse-Matrix mit einer Numpy-Matrix / einem Numpy-Array generiert werden kann, die nicht als Matrixoperation invers ist.
Virgil Ming
0

In Python kann die Scipy-Bibliothek verwendet werden, um die 2D -NumPy-Matrix in eine Sparse-Matrix zu konvertieren. SciPy 2-D Sparse-Matrix-Paket für numerische Daten ist scipy.sparse

Das Paket scipy.sparse bietet verschiedene Klassen, um die folgenden Arten von Sparse-Matrizen aus der zweidimensionalen Matrix zu erstellen :

  1. Block Sparse Row Matrix
  2. Eine spärliche Matrix im COOrdinate-Format.
  3. Komprimierte Sparse Column-Matrix
  4. Komprimierte Sparse Row-Matrix
  5. Sparse Matrix mit DIAgonal Speicher
  6. Dictionary Of Keys-basierte Sparse-Matrix.
  7. Zeilenbasierte Liste der Listen mit geringer Dichte
  8. Diese Klasse bietet eine Basisklasse für alle dünn besetzten Matrizen.

Die Formate CSR (Compressed Sparse Row) oder CSC (Compressed Sparse Column) unterstützen effiziente Zugriffs- und Matrixoperationen.

Beispielcode zum Konvertieren einer Numpy-Matrix in eine CSC-Matrix (Compressed Sparse Column) und einer CSR-Matrix (Compressed Sparse Row) mithilfe von Scipy-Klassen:

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

Erstellen Sie eine 2-D-Numpy-Matrix

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

Drucken Sie die Matrix und andere Details aus:

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

Konvertieren von Matrix A in die komprimierte Matrixmatrixdarstellung mit geringer Dichte mithilfe von csr_matrix Klasse:

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

Die Ausgabe von print-Anweisungen:

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

Konvertieren von Matrix A in eine komprimierte sparsame Spaltenmatrixdarstellung mit csc_matrix Klasse:

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

Die Ausgabe von print-Anweisungen:

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

Wie zu sehen ist, beträgt die Größe der komprimierten Matrizen 56 Bytes und die ursprüngliche Matrixgröße 184 Bytes.

Eine ausführlichere Erklärung und Codebeispiele finden Sie in diesem Artikel: https://limitlessdatascience.wordpress.com/2020/11/26/sparse-matrix-in-machine-learning/

Yogesh
quelle