3 Möglichkeiten, Matrizen in Python zu multiplizieren

In diesem Tutorial erfahren Sie, wie Sie zwei Matrizen in Python multiplizieren.

Sie lernen zunächst die Bedingung für eine gültige Matrizenmultiplikation und schreiben eine benutzerdefinierte Python-Funktion zum Multiplizieren von Matrizen. Als Nächstes werden Sie sehen, wie Sie dasselbe Ergebnis mit verschachtelten Listenverständnissen erzielen können.

Abschließend fahren Sie mit der Verwendung von NumPy und seinen integrierten Funktionen fort, um die Matrixmultiplikation effizienter durchzuführen.

So prüfen Sie, ob die Matrixmultiplikation gültig ist

Bevor wir Python-Code für die Matrizenmultiplikation schreiben, wollen wir uns noch einmal mit den Grundlagen der Matrizenmultiplikation befassen.

Die Matrixmultiplikation zwischen zwei Matrizen A und B ist nur gültig, wenn die Anzahl der Spalten in Matrix A gleich der Anzahl der Zeilen in Matrix B ist.

Wahrscheinlich sind Sie dieser Bedingung für die Matrixmultiplikation schon einmal begegnet. Haben Sie sich jedoch jemals gefragt, warum dies so ist?

Nun, das liegt an der Art und Weise, wie die Matrixmultiplikation funktioniert. Schauen Sie sich das Bild unten an.

In unserem allgemeinen Beispiel hat Matrix A m Zeilen und n Spalten. Und Matrix B hat n Zeilen und p Spalten.

Welche Form hat die Produktmatrix?

Das Element am Index (i, j) in der resultierenden Matrix C ist das Skalarprodukt der Zeile i der Matrix A und der Spalte j der Matrix B.

Um also ein Element an einem bestimmten Index in der resultierenden Matrix C zu erhalten, müssen Sie das Skalarprodukt der entsprechenden Zeile und Spalte in den Matrizen A bzw. B berechnen.

Wenn Sie den obigen Vorgang wiederholen, erhalten Sie die Produktmatrix C der Form mxp – mit m Zeilen und p Spalten, wie unten gezeigt.

Und das Skalarprodukt oder das Skalarprodukt zwischen zwei Vektoren a und b ist durch die folgende Gleichung gegeben.

Fassen wir jetzt zusammen:

  • Es ist offensichtlich, dass das Skalarprodukt nur zwischen Vektoren gleicher Länge definiert ist.
  • Damit also das Skalarprodukt zwischen einer Zeile und einer Spalte gültig ist – wenn Sie zwei Matrizen multiplizieren – müssten beide die gleiche Anzahl von Elementen haben.
  • Im obigen allgemeinen Beispiel hat jede Zeile in Matrix A n Elemente. Und jede Spalte in Matrix B hat auch n Elemente.

Wenn Sie genauer hinsehen, ist n die Anzahl der Spalten in Matrix A, und es ist auch die Anzahl der Zeilen in Matrix B. Und genau aus diesem Grund müssen Sie die Anzahl der Spalten in Matrix A gleich der Zahl benötigen von Zeilen in Matrix B.

Ich hoffe, Sie verstehen, dass die Bedingung für die Matrixmultiplikation gültig ist und wie Sie jedes Element in der Produktmatrix erhalten.

Lassen Sie uns damit fortfahren, Python-Code zu schreiben, um zwei Matrizen zu multiplizieren.

Schreiben Sie eine benutzerdefinierte Python-Funktion, um Matrizen zu multiplizieren

Lassen Sie uns als ersten Schritt eine benutzerdefinierte Funktion schreiben, um Matrizen zu multiplizieren.

Diese Funktion sollte Folgendes tun:

  • Akzeptieren Sie zwei Matrizen, A und B, als Eingaben.
  • Prüfen Sie, ob die Matrixmultiplikation zwischen A und B gültig ist.
  • Falls gültig, multiplizieren Sie die beiden Matrizen A und B und geben Sie die Produktmatrix C zurück.
  • Anderenfalls wird eine Fehlermeldung zurückgegeben, dass die Matrizen A und B nicht multipliziert werden können.
  So verwenden Sie die TRUNC-Funktion in Excel

Schritt 1: Generieren Sie zwei Matrizen von ganzen Zahlen mit der Funktion random.randint() von NumPy. Sie können Matrizen auch als verschachtelte Python-Listen deklarieren.

import numpy as np
np.random.seed(27)
A = np.random.randint(1,10,size = (3,3))
B = np.random.randint(1,10,size = (3,2))
print(f"Matrix A:n {A}n")
print(f"Matrix B:n {B}n")

# Output
Matrix A:
 [[4 9 9]
 [9 1 6]
 [9 2 3]]

Matrix B:
 [[2 2]
 [5 7]
 [4 4]]

Schritt 2: Fahren Sie fort und definieren Sie die Funktion multiply_matrix(A,B). Diese Funktion nimmt zwei Matrizen A und B als Eingaben und gibt die Produktmatrix C zurück, wenn die Matrixmultiplikation gültig ist.

def multiply_matrix(A,B):
  global C
  if  A.shape[1] == B.shape[0]:
    C = np.zeros((A.shape[0],B.shape[1]),dtype = int)
    for row in range(rows): 
        for col in range(cols):
            for elt in range(len(B)):
              C[row, col] += A[row, elt] * B[elt, col]
    return C
  else:
    return "Sorry, cannot multiply A and B."

Analysieren der Funktionsdefinition

Lassen Sie uns mit dem Analysieren der Funktionsdefinition fortfahren.

C als globale Variable deklarieren: Standardmäßig haben alle Variablen innerhalb einer Python-Funktion einen lokalen Geltungsbereich. Und Sie können nicht von außerhalb der Funktion darauf zugreifen. Um die Produktmatrix C von außen zugänglich zu machen, müssen wir sie als globale Variable deklarieren. Fügen Sie einfach den globalen Qualifizierer vor dem Variablennamen hinzu.

Prüfen Sie, ob die Matrixmultiplikation gültig ist: Verwenden Sie das Shape-Attribut, um zu prüfen, ob A und B multipliziert werden können. Für jedes Array arr, arr.shape[0] und arr.form[1] Geben Sie die Anzahl der Zeilen bzw. Spalten an. Wenn also A.Form[1] == B.Form[0] prüft, ob die Matrixmultiplikation gültig ist. Nur wenn diese Bedingung wahr ist, wird die Produktmatrix berechnet. Andernfalls gibt die Funktion eine Fehlermeldung zurück.

Verwenden Sie verschachtelte Schleifen, um Werte zu berechnen: Um die Elemente der resultierenden Matrix zu berechnen, müssen wir die Zeilen der Matrix A durchlaufen, und die äußere for-Schleife tut dies. Die innere for-Schleife hilft uns, die Spalte von Matrix B zu durchlaufen. Und die innerste for-Schleife hilft uns, auf jedes Element in der ausgewählten Spalte zuzugreifen.

▶️ Nachdem wir nun gelernt haben, wie die Python-Funktion zum Multiplizieren von Matrizen funktioniert, rufen wir die Funktion mit den zuvor generierten Matrizen A und B auf.

multiply_matrix(A,B)

# Output
array([[ 89, 107],
       [ 47,  49],
       [ 40,  44]])

Da die Matrixmultiplikation zwischen A und B gültig ist, gibt die Funktion multiply_matrix() die Produktmatrix C zurück.

Verwenden Sie Python Nested List Comprehension, um Matrizen zu multiplizieren

Im vorherigen Abschnitt haben Sie eine Python-Funktion zum Multiplizieren von Matrizen geschrieben. Jetzt werden Sie sehen, wie Sie verschachtelte Listenverständnisse verwenden können, um dasselbe zu tun.

Hier ist das Verständnis der verschachtelten Liste zum Multiplizieren von Matrizen.

Das mag zunächst kompliziert aussehen. Aber wir werden das Verständnis der verschachtelten Liste Schritt für Schritt analysieren.

Konzentrieren wir uns jeweils auf ein Listenverständnis und stellen fest, was es bewirkt.

  Beste Möglichkeiten, NFTs in Ihrem Zuhause anzuzeigen

Wir verwenden die folgende allgemeine Vorlage für das Listenverständnis:

[<do-this> for <item> in <iterable>]

where,
<do-this>: what you'd like to do—expression or operation
<item>: each item you'd like to perform the operation on
<iterable>: the iterable (list, tuple, etc.) that you're looping through

▶️ Sehen Sie sich unseren Leitfaden List Comprehension in Python an – mit Beispielen, um ein tieferes Verständnis zu erlangen.

Bevor Sie fortfahren, beachten Sie bitte, dass wir die resultierende Matrix C zeilenweise erstellen möchten.

Verschachteltes Listenverständnis erklärt

Schritt 1: Berechnen Sie einen einzelnen Wert in der Matrix C

Bei gegebener Zeile i von Matrix A und Spalte j von Matrix B ergibt der folgende Ausdruck den Eintrag am Index (i, j) in Matrix C.

sum(a*b for a,b in zip(A_row, B_col)

# zip(A_row, B_col) returns an iterator of tuples
# If A_row = [a1, a2, a3] & B_col = [b1, b2, b3]
# zip(A_row, B_col) returns (a1, b1), (a2, b2), and so on

Wenn i = j = 1, gibt der Ausdruck den Eintrag c_11 der Matrix C zurück. Auf diese Weise können Sie also ein Element in einer Zeile erhalten.

Schritt 2: Erstellen Sie eine Zeile in der Matrix C

Unser nächstes Ziel ist es, eine ganze Reihe zu bauen.

Für Zeile 1 in Matrix A müssen Sie alle Spalten in Matrix B durchlaufen, um eine vollständige Zeile in Matrix C zu erhalten.

Gehen Sie zurück zur Listenverständnisvorlage.

  • Ersetzen Sie durch den Ausdruck aus Schritt 1, denn das möchten Sie tun.
  • Ersetzen Sie als Nächstes durch B_col – jede Spalte in Matrix B.
  • Ersetzen Sie schließlich durch zip(*B) – die Liste, die alle Spalten in Matrix B enthält.

Und hier ist das erste Listenverständnis.

[sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B)] 

# zip(*B): * is the unzipping operator
# zip(*B) returns a list of columns in matrix B

Schritt 3: Baue alle Zeilen und erhalte die Matrix C

Als nächstes müssen Sie die Produktmatrix C füllen, indem Sie die restlichen Zeilen berechnen.

Und dafür müssen Sie alle Zeilen in Matrix A durchlaufen.

Gehen Sie noch einmal zurück zum Listenverständnis und gehen Sie wie folgt vor.

  • Ersetzen Sie durch das Listenverständnis aus Schritt 2. Denken Sie daran, dass wir im vorherigen Schritt eine ganze Zeile berechnet haben.
  • Ersetzen Sie nun durch A_row – jede Zeile in Matrix A.
  • Und Ihr ist die Matrix A selbst, während Sie ihre Zeilen durchlaufen.

Und hier ist unser letztes Verständnis der verschachtelten Liste.🎊

[[sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B)] 
    for A_row in A]

Es ist Zeit, das Ergebnis zu überprüfen! ✔

# cast into <a href="https://wdzwdz.com/numpy-reshape-arrays-in-python/">NumPy array</a> using np.array()
C = np.array([[sum(a*b for a,b in zip(A_row, B_col)) for B_col in zip(*B)] 
    for A_row in A])

# Output:
[[ 89 107]
 [ 47  49]
 [ 40  44]]

Wenn Sie genauer hinsehen, entspricht dies den verschachtelten for-Schleifen, die wir zuvor hatten – nur dass es prägnanter ist.

Sie können dies auch noch effizienter tun, indem Sie einige eingebaute Funktionen verwenden. Lassen Sie uns im nächsten Abschnitt mehr über sie erfahren.

Verwenden Sie NumPy matmul(), um Matrizen in Python zu multiplizieren

np.matmul() übernimmt zwei Matrizen als Eingabe und gibt das Produkt zurück, wenn die Matrixmultiplikation zwischen den Eingabematrizen gültig ist.

C = np.matmul(A,B)
print(C)

# Output:
[[ 89 107]
 [ 47  49]
 [ 40  44]]

Beachten Sie, dass diese Methode einfacher ist als die beiden zuvor erlernten Methoden. Tatsächlich können Sie anstelle von np.matmul() einen äquivalenten @-Operator verwenden, und das werden wir gleich sehen.

So verwenden Sie den @-Operator in Python, um Matrizen zu multiplizieren

In Python ist @ ein binärer Operator, der für die Matrixmultiplikation verwendet wird.

Es arbeitet mit zwei Matrizen und im Allgemeinen N-dimensionalen NumPy-Arrays und gibt die Produktmatrix zurück.

Hinweis: Sie benötigen Python 3.5 und höher, um den @-Operator verwenden zu können.

So können Sie es verwenden.

C = [email protected]
print(C)

# Output
array([[ 89, 107],
       [ 47,  49],
       [ 40,  44]])

Beachten Sie, dass die Produktmatrix C die gleiche ist wie die, die wir zuvor erhalten haben.

Können Sie np.dot() verwenden, um Matrizen zu multiplizieren?

Wenn Sie jemals auf Code gestoßen sind, der np.dot() verwendet, um zwei Matrizen zu multiplizieren, sehen Sie hier, wie es funktioniert.

C = np.dot(A,B)
print(C)

# Output:
[[ 89 107]
 [ 47  49]
 [ 40  44]]

Sie werden sehen, dass np.dot(A, B) auch die erwartete Produktmatrix zurückgibt.

Allerdings gem NumPy-Dokumentesollten Sie np.dot() nur zur Berechnung des Skalarprodukts zweier eindimensionaler Vektoren und nicht zur Matrixmultiplikation verwenden.

Erinnern Sie sich an den vorherigen Abschnitt, das Element am Index (i, j) der Produktmatrix C ist das Skalarprodukt der Zeile i der Matrix A und der Spalte j der Matrix B.

Da NumPy diese Punktproduktoperation implizit an alle Zeilen und alle Spalten sendet, erhalten Sie die resultierende Produktmatrix. Aber um Ihren Code lesbar zu halten und Mehrdeutigkeiten zu vermeiden, verwenden Sie stattdessen np.matmul() oder den @-Operator.

Fazit

🎯 In diesem Tutorial haben Sie Folgendes gelernt.

  • Bedingung für eine gültige Matrixmultiplikation: Spaltenanzahl in Matrix A = Zeilenanzahl in Matrix B.
  • So schreiben Sie eine benutzerdefinierte Python-Funktion, die prüft, ob die Matrixmultiplikation gültig ist, und die Produktmatrix zurückgibt. Der Hauptteil der Funktion verwendet verschachtelte for-Schleifen.
  • Als Nächstes haben Sie gelernt, wie Sie verschachtelte Listen verwenden, um Matrizen zu multiplizieren. Sie sind prägnanter als for-Schleifen, neigen aber zu Lesbarkeitsproblemen.
  • Schließlich haben Sie gelernt, die in NumPy integrierte Funktion np.matmul() zu verwenden, um Matrizen zu multiplizieren, und wie dies in Bezug auf die Geschwindigkeit am effizientesten ist.
  • Sie haben auch den @-Operator kennengelernt, um zwei Matrizen in Python zu multiplizieren.

Und damit endet unsere Diskussion über die Matrixmultiplikation in Python. Als nächsten Schritt erfahren Sie, wie Sie in Python prüfen, ob eine Zahl eine Primzahl ist. Oder lösen Sie interessante Probleme mit Python-Strings.

Viel Spaß beim Lernen!🎉

  So erstellen Sie ein Flussdiagramm in Word