Sparse Matrix in Python

Aditya Raj 30 Januar 2023
  1. Was ist eine Sparse-Matrix in Python?
  2. So erstellen Sie Sparse-Matrizen in Python
  3. Konvertieren eine normale Matrix in eine Sparse-Matrix mit dem SciPy-Modul in Python
  4. Komprimierte Sparse-Spaltenmatrix in Python
  5. Sparse-Matrix im Koordinatenformat in Python
  6. Dictionary der schlüsselbasierten Sparse-Matrix in Python
  7. Fazit
Sparse Matrix in Python

Bei der Implementierung von Algorithmen für maschinelles Lernen in Python müssen wir die Eingabedaten häufig in einem Format darstellen, das weniger Speicher benötigt.

Normalerweise werden die Eingabedaten, die den maschinellen Lernalgorithmen gegeben werden, in Matrixform dargestellt. In diesem Artikel wird die Verwendung der Sparse-Matrix zum Speichern von Daten in Python erläutert.

Dazu lernen wir verschiedene Darstellungen der Sparse-Matrix in Python kennen. Wir werden auch sehen, wie man eine einfache Matrix mit den im scipy-Modul in Python definierten Funktionen in eine spärliche Darstellung umwandelt.

Was ist eine Sparse-Matrix in Python?

Eine dünn besetzte Matrix ist eine Matrix, deren meisten Elemente 0 sind. Das heißt, die Matrix enthält nur an wenigen Stellen Daten.

Ein Beispiel für die Sparse-Matrix ist wie folgt.

[[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]]

Hier sehen Sie, dass die meisten Elemente in der Matrix 0 sind.

Sparse-Matrizen werden in großem Umfang bei der Verarbeitung natürlicher Sprache und der Datencodierung verwendet. Wenn die meisten Elemente in der Matrix 0 sind, wird das Speichern aller Matrixelemente speicherintensiv.

Dies liegt daran, dass wir nur wenige Datenpunkte haben und der größte Teil des Speichers durch redundante Nullen belegt ist.

So erstellen Sie Sparse-Matrizen in Python

Um die Speichernutzung für die redundanten Nullen in einer gegebenen Matrix zu vermeiden, können wir eine normale Matrix in eine dünn besetzte Matrix umwandeln.

Sie können sich eine Sparse-Matrix als eine Liste mit drei Elementen vorstellen. Die innere Liste der Liste speichert die Zeilennummer, Spaltennummer und den Wert der Nicht-Null-Elemente der gegebenen Eingabematrix. Dies stellt die dünne Matrix dar.

Betrachten Sie beispielsweise die folgende Eingabematrix.

[[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]]

Diese Matrix hat nur an zwei Stellen Nicht-Null-Elemente: (0,0) und (2,3).

Um diese Matrix in eine Sparse-Matrix umzuwandeln, erstellen wir eine Liste, die die Sparse-Matrix darstellt. Die Liste enthält Listen, die die Zeilennummer, Spaltennummer und den Wert der Nicht-Null-Elemente enthalten.

Wir haben also zwei innere Listen in der Sparse-Matrix: [0,0,16] und [2,3,5]. Die endgültige Sparse-Matrix sieht wie folgt aus.

[[0, 0, 16], [2, 3, 5]]

Hier,

  • Das erste Element der inneren Listen repräsentiert die Zeilennummer der Nicht-Null-Elemente der Eingabematrix.
  • Das zweite Element der inneren Listen repräsentiert die Spaltennummer der Nicht-Null-Elemente der Eingabematrix.
  • Schließlich enthält das dritte Element der inneren Liste den tatsächlichen Wert der Nicht-Null-Elemente.

Um die Sparse-Matrix aus einer gegebenen Matrix zu erstellen, erstellen wir zuerst eine Liste sparse_matrix, die die Sparse-Matrix darstellt. Danach durchlaufen wir die Eingabematrix mit einer for-Schleife.

Wenn wir beim Durchlaufen ein Element ungleich Null in der Matrix finden, erstellen wir eine Liste, die das Tripel aus Zeilennummer, Spaltennummer und dem Elementwert enthält. Danach fügen wir die Liste mit der Methode append() zu sparse_matrix hinzu.

Nach Ausführung der for-Schleife haben wir die Sparse-Matrix in der Liste sparse_matrix. Dies können Sie im folgenden Beispiel beobachten.

import numpy as np

input_matrix = np.array([[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]])
print("The input matrix is:")
print(input_matrix)
sparse_matrix = []
rows, cols = input_matrix.shape
for i in range(rows):
    for j in range(cols):
        if input_matrix[i][j] != 0:
            triplet = [i, j, input_matrix[i][j]]
            sparse_matrix.append(triplet)
print("The sparse matrix is:")
print(sparse_matrix)

Ausgabe:

The input matrix is:
[[16  0  0  0]
 [ 0  0  0  0]
 [ 0  0  0  5]
 [ 0  0  0  0]]
The sparse matrix is:
[[0, 0, 16], [2, 3, 5]]

Sie können beobachten, dass die Sparse-Matrix im Vergleich zur Eingabematrix sehr wenige Elemente hat.

Die Verwendung der Sparse-Matrix ist sehr nützlich, wenn die Eingabematrix eine Größe von 1024x1024 oder mehr hat, wie in realen maschinellen Lernanwendungen. Die Größe der Sparse-Matrix wird im Vergleich zur Eingabematrix deutlich geringer.

Denken Sie daran, dass, wenn die Anzahl der Nicht-Null-Elemente in einer Matrix größer als ein Drittel der gesamten Elemente in der Matrix ist, das Erstellen und Verwenden einer Sparse-Matrix kostspieliger wird als die Verwendung der ursprünglichen Matrix. Wenn eine Matrix n Nicht-Null-Elemente hat, enthält die Sparse-Matrix 3*n Elemente.

Konvertieren eine normale Matrix in eine Sparse-Matrix mit dem SciPy-Modul in Python

Mit dem Modul scipy können wir auch eine Normalmatrix in eine Sparse-Matrix umwandeln. Das Modul scipy bietet verschiedene Methoden, um eine normale Matrix in eine dünn besetzte Matrix umzuwandeln.

Lassen Sie uns alle Methoden einzeln besprechen.

Komprimierte Sparse-Row-Matrix in Python

Compressed Sparse Row (CSR)-Matrizen sind Matrizen mit geringer Dichte, die wir in arithmetischen Operationen verwenden können.

CSR-Matrizen unterstützen Addition, Subtraktion, Multiplikation, Division und Potenzmatrixberechnung. Sie können eine normale Matrix mit der im Python-Modul scipy definierten csr_matrix()-Methode in eine komprimierte Sparse-Row-Matrix umwandeln.

Wie unten gezeigt, nimmt die Methode csr_matrix() eine normale Matrix als Eingabe und gibt eine Sparse-Matrix zurück.

import numpy as np
from scipy import sparse

input_matrix = np.array([[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]])
print("The input matrix is:")
print(input_matrix)
sparse_matrix = sparse.csr_matrix(input_matrix)
print("The sparse matrix is:")
print(sparse_matrix)

Ausgabe:

The input matrix is:
[[16  0  0  0]
 [ 0  0  0  0]
 [ 0  0  0  5]
 [ 0  0  0  0]]
The sparse matrix is:
  (0, 0)	16
  (2, 3)	5

Komprimierte Sparse-Zeilenmatrizen ermöglichen ein effizientes Zeilen-Slicing und schnelle Matrix-Vektor-Produkte. Spaltenaufteilungsvorgänge sind jedoch in CSR-Matrizen langsam.

Komprimierte Sparse-Spaltenmatrix in Python

Wir können eine komprimierte Sparse-Column (CSC)-Matrix anstelle der CSR-Matrizen in den Programmen verwenden, die ein Spalten-Slicing benötigen.

Sie können eine CSC-Matrix in Python mit der im Modul scipy definierten csc_matrix()-Methode erstellen. Die Methode csc_matrix() akzeptiert eine normale Matrix als Eingabeargument und gibt darunter eine dünn besetzte Matrix zurück.

import numpy as np
from scipy import sparse

input_matrix = np.array([[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]])
print("The input matrix is:")
print(input_matrix)
sparse_matrix = sparse.csc_matrix(input_matrix)
print("The sparse matrix is:")
print(sparse_matrix)

Ausgabe:

The input matrix is:
[[16  0  0  0]
 [ 0  0  0  0]
 [ 0  0  0  5]
 [ 0  0  0  0]]
The sparse matrix is:
  (0, 0)	16
  (2, 3)	5

Komprimierte Sparse-Spaltenmatrizen ermöglichen im Vergleich zu komprimierten Sparse-Row-Matrizen ein schnelleres Spalten-Slicing und ein langsameres Zeilen-Slicing.

Sparse-Matrix im Koordinatenformat in Python

Das Koordinatenformat ist eine schnellere Methode zum Erstellen von Matrizen mit geringer Dichte. Mit der im Modul scipy definierten Methode coo_matrix() können Sie eine Sparse-Matrix im Koordinatenformat erstellen.

coo_matrix() akzeptiert eine normale Matrix als Eingabeargument und gibt eine dünn besetzte Matrix im Koordinatenformat zurück, wie unten gezeigt.

import numpy as np
from scipy import sparse

input_matrix = np.array([[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]])
print("The input matrix is:")
print(input_matrix)
sparse_matrix = sparse.coo_matrix(input_matrix)
print("The sparse matrix is:")
print(sparse_matrix)

Ausgabe:

The input matrix is:
[[16  0  0  0]
 [ 0  0  0  0]
 [ 0  0  0  5]
 [ 0  0  0  0]]
The sparse matrix is:
  (0, 0)	16
  (2, 3)	5

Wenn Sie eine normale Matrix in eine CSR- oder CSC-Matrix konvertieren müssen, sollten Sie zuerst die normale Matrix in eine dünn besetzte Matrix im Koordinatenformat konvertieren. Danach können Sie die Sparse-Matrix in das gewünschte Format konvertieren.

Eine Sparse-Matrix im Koordinatenformat wird meistens verwendet, um Matrizen von einem Format in ein anderes zu verbinden. Arithmetische Operationen oder Slicing werden nicht unterstützt.

Dictionary der schlüsselbasierten Sparse-Matrix in Python

Eine auf einem Schlüsselverzeichnis (Dictionary of Keys, DOK) basierende Sparse-Matrix bietet O(1)-Zugriff auf die Elemente in der Matrix.

Außerdem enthalten DOK-basierte Matrizen keine doppelten Werte. Sie können ein Dictionary der schlüsselbasierten Sparse-Matrix erstellen, indem Sie die im Modul scipy definierte Methode dok_sparse() verwenden.

Wie unten gezeigt, nimmt die Methode dok_sparse() eine normale Matrix und gibt eine Sparse-Matrix zurück.

import numpy as np
from scipy import sparse

input_matrix = np.array([[16, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 5], [0, 0, 0, 0]])
print("The input matrix is:")
print(input_matrix)
sparse_matrix = sparse.dok_matrix(input_matrix)
print("The sparse matrix is:")
print(sparse_matrix)

Ausgabe:

The input matrix is:
[[16  0  0  0]
 [ 0  0  0  0]
 [ 0  0  0  5]
 [ 0  0  0  0]]
The sparse matrix is:
  (0, 0)	16
  (2, 3)	5

Fazit

In diesem Artikel haben wir Sparse-Matrizen und ihre Implementierung in Python besprochen. Wir haben auch verschiedene Möglichkeiten gesehen, eine normale Matrix in Python in eine Sparse-Matrix umzuwandeln.

Beim Erstellen einer Sparse-Matrix sollten Sie die beabsichtigte Verwendung der Matrix kennen. Wenn es viele Spalten-Slicing-Operationen gibt, sollten Sie eine CSC-Matrix erstellen.

Für Row Slicing-Vorgänge sollten Sie eine CSR-Matrix erstellen. Wenn die Eingabematrix groß ist, sollten Sie sie zuerst in eine Sparse-Matrix im Koordinatenformat konvertieren. Danach können Sie die gewünschte Sparse-Matrix erhalten.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

Verwandter Artikel - Python Matrix