Sparse arrays (scipy.sparse)#
SciPy 2-D Sparse-Array-Paket für numerische Daten.
Hinweis
Dieses Paket stellt von der älteren Matrix-Schnittstelle auf eine Array-Schnittstelle um, die mit NumPy-Arrays kompatibel ist. Wir empfehlen, für alle neuen Arbeiten die Array-Objekte (bsr_array, coo_array usw.) zu verwenden.
Bei Verwendung der Array-Schnittstelle beachten Sie bitte, dass
x * ynicht mehr die Matrixmultiplikation, sondern die elementweise Multiplikation durchführt (genau wie bei NumPy-Arrays). Um Code zu schreiben, der sowohl mit Arrays als auch mit Matrizen funktioniert, verwenden Siex @ yfür die Matrixmultiplikation.Operationen wie
sum, die früher dichte Matrizen erzeugten, erzeugen nun Arrays, deren Multiplikationsverhalten ähnlich unterschiedlich ist.Sparse-Arrays verwenden Array-basierte *Slicing*-Operationen, die Skalare, 1D- oder 2D-Sparse-Arrays zurückgeben. Wenn Sie 2D-Ergebnisse benötigen, verwenden Sie einen entsprechenden Index. Z. B.
A[:, i, None]oderA[:, [i]].Alle Index-Arrays für ein gegebenes Sparse-Array sollten denselben dtype haben. Zum Beispiel sollten für das CSR-Format
indicesundindptrdenselben dtype haben. Für COO sollte jedes Array in coords denselben dtype haben.
Die Konstruktionshilfsprogramme (eye, kron, random, diags usw.) haben entsprechende Ersetzungen (siehe Erstellung von Sparse-Arrays).
Weitere Informationen finden Sie unter Migration von spmatrix zu sparray.
Submodule#
Sparse-Array-Klassen#
|
Block Sparse Row-Format Sparse-Array. |
|
Ein Sparse-Array im COOrdinate-Format. |
|
Compressed Sparse Column Array. |
|
Compressed Sparse Row Array. |
|
Sparse-Array mit DIAgonaler Speicherung. |
|
Dictionary Of Keys-basiertes Sparse-Array. |
|
Reihenbasierte LIst of Lists Sparse-Array. |
|
Diese Klasse stellt eine Basisklasse für alle Sparse-Arrays dar. |
Erstellung von Sparse-Arrays#
|
Konstruiere ein Sparse-Array aus Diagonalen. |
|
Sparse-Array gewählter Form mit Einsen auf der k-ten Diagonale und Nullen ansonsten. |
|
Gibt ein Sparse-Array mit gleichmäßig zufälligen Zahlen in [0, 1) zurück. |
|
Erstelle ein Sparse-Array aus Sparse-Subblöcken. |
Kombinieren von Arrays#
|
Kronecker-Produkt der Sparse-Matrizen A und B. |
|
Kronecker-Summe von quadratischen Sparse-Matrizen A und B. |
|
Erstellt eine blockdiagonale Sparse-Matrix oder ein Sparse-Array aus den bereitgestellten Matrizen. |
|
Gibt den unteren Dreiecksteil eines Sparse-Arrays oder einer Sparse-Matrix zurück. |
|
Gibt den oberen Dreiecksteil eines Sparse-Arrays oder einer Sparse-Matrix zurück. |
|
Stapelt Sparse-Matrizen horizontal (spaltenweise). |
|
Stapelt Sparse-Arrays vertikal (zeilenweise). |
Sparse-Werkzeuge#
|
Speichert eine Sparse-Matrix oder ein Sparse-Array mit dem |
|
Lädt eine Sparse-Matrix/ein Sparse-Array mit dem |
|
Gibt die Indizes und Werte der Nicht-Null-Elemente einer Matrix zurück. |
|
Bestimmt basierend auf den Eingabe-(Integer-)Arrays a einen geeigneten Indexdatentyp, der die Daten in den Arrays aufnehmen kann. |
|
Gibt die Indizes von Sparse-Arrays sicher nach idx_dtype um. |
Identifizieren von Sparse-Arrays#
|
Ist x ein Sparse-Array oder eine Sparse-Matrix? |
Sparse-Matrix-Klassen#
|
Block Sparse Row-Format Sparse-Matrix. |
|
Eine Sparse-Matrix im COOrdinate-Format. |
|
Compressed Sparse Column Matrix. |
|
Compressed Sparse Row Matrix. |
|
Sparse-Matrix mit DIAgonaler Speicherung. |
|
Dictionary Of Keys-basierte Sparse-Matrix. |
|
Reihenbasierte LIst of Lists Sparse-Matrix. |
|
Diese Klasse stellt eine Basisklasse für alle Sparse-Matrix-Klassen dar. |
Erstellung von Sparse-Matrizen#
|
Sparse-Matrix gewählter Form mit Einsen auf der k-ten Diagonale und Nullen ansonsten. |
|
Identitätsmatrix im Sparse-Format. |
|
Konstruiere eine Sparse-Matrix aus Diagonalen. |
|
Gibt eine Sparse-Matrix aus Diagonalen zurück. |
|
Erstellt ein Sparse-Array oder eine Sparse-Matrix aus Sparse-Subblöcken. |
|
Erzeuge eine Sparse-Matrix der gegebenen Form und Dichte mit zufällig verteilten Werten. |
|
Erzeuge eine Sparse-Matrix der gegebenen Form und Dichte mit gleichmäßig verteilten Werten. |
Das Kombinieren von Matrizen verwendet dieselben Funktionen wie Kombinieren von Arrays.
Identifizieren von Sparse-Matrizen#
|
Ist x ein Sparse-Array oder eine Sparse-Matrix? |
|
Ist x eine Sparse-Matrix? |
Ist x vom Typ csc_matrix? |
|
Ist x vom Typ csr_matrix? |
|
Ist x vom Typ bsr_matrix? |
|
Ist x vom Typ lil_matrix? |
|
Ist x vom Typ dok_array? |
|
Ist x vom Typ coo_matrix? |
|
Ist x vom Typ dia_matrix? |
Warnungen#
Die Warnung, die ausgegeben wird, wenn die Operation für Sparse-Matrizen ineffizient ist. |
|
Allgemeine Warnung für |
Verwendungsinformationen#
Es gibt sieben verfügbare Sparse-Array-Typen:
csc_array: Compressed Sparse Column-Format
csr_array: Compressed Sparse Row-Format
bsr_array: Block Sparse Row-Format
lil_array: List of Lists-Format
dok_array: Dictionary of Keys-Format
coo_array: COOrdinate-Format (auch bekannt als IJV, Triplett-Format)
dia_array: DIAgonal-Format
Um ein Array effizient zu erstellen, verwenden Sie coo_array, dok_array oder lil_array. dok_array und lil_array unterstützen grundlegendes Slicing und Fancy-Indexing mit einer ähnlichen Syntax wie NumPy-Arrays. Das COO-Format unterstützt (noch) kein Indexing, kann aber auch zur effizienten Erstellung von Arrays mit Koordinaten- und Werteinformationen verwendet werden.
Trotz ihrer Ähnlichkeit mit NumPy-Arrays wird **dringend davon abgeraten**, NumPy-Funktionen direkt auf diesen Arrays zu verwenden, da NumPy sie typischerweise als generische Python-Objekte und nicht als Arrays behandelt, was zu unerwarteten (und falschen) Ergebnissen führt. Wenn Sie eine NumPy-Funktion auf diese Arrays anwenden möchten, prüfen Sie zuerst, ob SciPy eine eigene Implementierung für die gegebene Sparse-Array-Klasse hat, oder **konvertieren Sie das Sparse-Array in ein NumPy-Array** (z. B. mit der toarray-Methode der Klasse), bevor Sie die Methode anwenden.
Alle Konvertierungen zwischen den Formaten CSR, CSC und COO sind effiziente Operationen in linearer Zeit.
Um Manipulationen wie Multiplikation oder Inversion durchzuführen, konvertieren Sie das Array zuerst in das Format CSC oder CSR. Das Format lil_array ist reihenbasiert, daher ist die Konvertierung in CSR effizient, während die Konvertierung in CSC weniger effizient ist.
Matrix-Vektor-Produkt#
Für ein Vektorprodukt zwischen einem 2D-Sparse-Array und einem Vektor verwenden Sie den Matmul-Operator (d. h. @), der ein Skalarprodukt durchführt (ähnlich der dot-Methode).
>>> import numpy as np
>>> from scipy.sparse import csr_array
>>> A = csr_array([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
>>> v = np.array([1, 0, -1])
>>> A @ v
array([ 1, -3, -1], dtype=int64)
Das CSR-Format eignet sich besonders gut für schnelle Matrix-Vektor-Produkte.
Beispiel 1#
Konstruiere ein 1000x1000 lil_array und füge einige Werte hinzu.
>>> from scipy.sparse import lil_array
>>> from scipy.sparse.linalg import spsolve
>>> from numpy.linalg import solve, norm
>>> from numpy.random import rand
>>> A = lil_array((1000, 1000))
>>> A[0, :100] = rand(100)
>>> A.setdiag(rand(1000))
Konvertiere es nun in das CSR-Format und löse A x = b nach x auf.
>>> A = A.tocsr()
>>> b = rand(1000)
>>> x = spsolve(A, b)
Konvertiere es in ein dichtes Array und löse es auf, und prüfe, ob das Ergebnis dasselbe ist.
>>> x_ = solve(A.toarray(), b)
Nun können wir die Norm des Fehlers mit
>>> err = norm(x-x_)
>>> err < 1e-9
True
berechnen. Sie sollte klein sein :)
Beispiel 2#
Konstruiere ein Array im COO-Format.
>>> from scipy import sparse
>>> from numpy import array
>>> I = array([0,3,1,0])
>>> J = array([0,3,1,2])
>>> V = array([4,5,7,9])
>>> A = sparse.coo_array((V,(I,J)),shape=(4,4))
Beachte, dass die Indizes nicht sortiert sein müssen.
Duplizierte (i,j)-Einträge werden beim Konvertieren nach CSR oder CSC summiert.
>>> I = array([0,0,1,3,1,0,0])
>>> J = array([0,2,1,3,1,0,0])
>>> V = array([1,1,1,1,1,1,1])
>>> B = sparse.coo_array((V,(I,J)),shape=(4,4)).tocsr()
Dies ist nützlich für die Erstellung von Steifigkeits- und Massenmatrizen für finite Elemente.
Weitere Details#
CSR-Spaltenindizes sind nicht notwendigerweise sortiert. Ebenso für CSC-Zeilenindizes. Verwenden Sie die Methoden .sorted_indices() und .sort_indices(), wenn sortierte Indizes benötigt werden (z. B. beim Übergeben von Daten an andere Bibliotheken).