Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die Sparse-Speicherung und Konvertierung von Python-Sparse-Matrizen

Detaillierte Einführung in die Sparse-Speicherung und Konvertierung von Python-Sparse-Matrizen

黄舟
黄舟Original
2017-05-28 10:56:307619Durchsuche

In diesem Artikel werden hauptsächlich Python Sparse-Matrix-Sparse-Speicher- und Konvertierungsinformationen vorgestellt 🎜>

Die Speicherform spärlicher Matrizen

Bei der Lösung linearer
from scipy import sparse
Modelle

in den Bereichen Wissenschaft und Technik treten häufig viele große Matrizen auf Die Elemente in sind 0, daher spricht man von einer dünn besetzten Matrix. Die Verwendung des ndarray array von NumPy zum Speichern einer solchen Matrix führt zu einer Speicherverschwendung. Aufgrund der spärlichen Beschaffenheit der Matrix können Sie Speicherverbrauch sparen, indem Sie nur relevante Informationen über Elemente ungleich Null speichern. Darüber hinaus kann das Schreiben der Operation

Funktion

für diese spezielle Struktur der Matrix auch die Berechnungsgeschwindigkeit der Matrix verbessern. Die scipy.sparse-Bibliothek bietet mehrere Formate zur Darstellung dünnbesetzter Matrizen. Jedes Format hat unterschiedliche Verwendungszwecke, unter anderem eignen sich dok_matrix und lil_matrix zum schrittweisen Hinzufügen von Elementen. dok_matrix erbt von dict, das ein Wörterbuch verwendet, um die Elemente zu speichern, die in der Matrix nicht 0 sind: Der Schlüssel des Wörterbuchs ist ein Tupel, das das Element (Zeile, Spalte) speichert. Informationen, und sein entsprechender Wert ist der Elementwert, der sich in (Zeile, Spalte) in der Matrix befindet. Offensichtlich eignet sich die Sparse-Matrix im Wörterbuchformat sehr gut für Additions-, Lösch- und Zugriffsoperationen einzelner Elemente. Wird normalerweise verwendet, um schrittweise Elemente ungleich Null hinzuzufügen und dann in

andere

Formate zu konvertieren, die schnelle Vorgänge unterstützen.

lil_matrix verwendet zwei Listen, um Nicht-Null-Elemente zu speichern. Daten speichert die Nicht-Null-Elemente in jeder Zeile und Zeilen speichert die Spalten, in denen sich die Nicht-Null-Elemente befinden. Dieses Format eignet sich auch hervorragend, um Elemente einzeln hinzuzufügen und schnell zeilenbezogene Daten abzurufen. coo_matrix verwendet drei Arrays Zeile, Spalte und Daten, um die Informationen von Elementen ungleich Null zu speichern. Die drei Arrays haben die gleiche Länge, row enthält die Zeile der Elemente, col enthält die Spalte der Elemente und data enthält den Wert des Elements. coo_matrix unterstützt den Zugriff, das Hinzufügen und das Löschen von Elementen nicht. Nach der Erstellung ist es fast unmöglich, Operationen oder Matrixoperationen darauf auszuführen, außer es in eine Matrix in anderen Formaten zu konvertieren.

a = sparse.dok_matrix((10, 5))
a[2:5, 3] = 1.0, 2.0, 3.0
print a.keys()
print a.values()
coo_matrix unterstützt wiederholte Elemente, d. h. dieselben Zeilen- und Spaltenkoordinaten können mehrmals vorkommen. Bei der Konvertierung in eine Matrix in andere Formate werden mehrere Werte, die denselben Zeilen- und Spaltenkoordinaten entsprechen, summiert. Im folgenden Beispiel entspricht (2, 3) zwei Werten: 1 und 10. Bei der Konvertierung in ein ndarray-Array werden diese beiden Werte addiert, sodass der Wert an den Koordinaten von (2, 3) entsteht. in der endgültigen Matrix ist 11 .
[(2, 3), (3, 3), (4, 3)]
[1.0, 2.0, 3.0]

Viele spärliche Matrixdaten werden in Dateien in diesem Format gespeichert. Beispielsweise kann eine CSV-Datei drei Spalten haben: „Benutzer-ID, Produkt-ID, Bewertungswert“. Nachdem die Daten mit numpy.loadtxt oder pandas.read_csv gelesen wurden, können sie über coo_matrix schnell in eine Sparse-Matrix konvertiert werden: Jede Zeile der Matrix entspricht einem Benutzer, jede Spalte entspricht einem Produkt und der Elementwert ist die Bewertung des Benutzers des Produkts.

b = sparse.lil_matrix((10, 5))
b[2, 3] = 1.0
b[3, 4] = 2.0
b[3, 2] = 3.0
print b.data
print b.rows
[[] [] [1.0] [3.0, 2.0] [] [] [] [] [] []]
[[] [] [3] [2, 4] [] [] [] [] [] []]

Wählen Sie aus persönlichen Operationen. coo_matrix wird ausgewählt, weil es sich um spärliche Matrixoperationen handelt. Wenn es jedoch nicht in anderen Formen gespeichert wird, ist die Komplexität zu hoch (Zeit und Raum). Eine Matrix von 1000*1000 dauert etwa 2 Stunden, ebenfalls fatal. Ich hatte keine andere Wahl, als an die Tripel des Dateneingabeformats in der Pajek-Software zu denken:

Also dachte ich daran, meine eigenen Daten in ähnliche Tripel zu verarbeiten!

Das heißt „matrix“ –>“tupel dreifach“ –>“sparseMatrix2tuple“ –>“scipy.sparse“
row = [2, 3, 3, 2]
col = [3, 4, 2, 3]
data = [1, 2, 3, 10]
c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))
print c.col, c.row, c.data
print c.toarray()

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Sparse-Speicherung und Konvertierung von Python-Sparse-Matrizen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn