3 moduri de a multiplica matrice în Python

În acest tutorial, veți învăța cum să înmulțiți două matrice în Python.

Veți începe prin a învăța condiția pentru înmulțirea matricelor validă și veți scrie o funcție personalizată Python pentru a multiplica matrice. În continuare, veți vedea cum puteți obține același rezultat folosind listele de înțelegere imbricate.

În cele din urmă, veți continua să utilizați NumPy și funcțiile sale încorporate pentru a efectua înmulțirea matricei mai eficient.

Cum se verifică dacă înmulțirea matriceală este validă

Înainte de a scrie codul Python pentru înmulțirea matricei, să revedem elementele de bază ale înmulțirii matricelor.

Înmulțirea matriceală între două matrice A și B este valabilă numai dacă numărul de coloane din matricea A este egal cu numărul de rânduri din matricea B.

Probabil ați fi întâlnit această condiție pentru înmulțirea matricei înainte. Cu toate acestea, v-ați întrebat vreodată de ce este așa?

Ei bine, este din cauza modului în care funcționează înmulțirea matricei. Aruncă o privire la imaginea de mai jos.

În exemplul nostru generic, matricea A are m rânduri și n coloane. Și matricea B are n rânduri și p coloane.

Care este forma matricei produsului?

Elementul de la indicele (i, j) din matricea rezultată C este produsul scalar al rândului i al matricei A și coloana j a matricei B.

Deci, pentru a obține un element la un anumit indice din matricea rezultată C, va trebui să calculați produsul scalar al rândului și coloanei corespunzătoare din matricele A și, respectiv, B.

Repetând procesul de mai sus, veți obține matricea de produs C cu forma mxp – cu m rânduri și p coloane, așa cum se arată mai jos.

Iar produsul scalar sau produsul interior dintre doi vectori a și b este dat de următoarea ecuație.

Să rezumam acum:

  • Este evident că produsul punctual este definit doar între vectori de lungime egală.
  • Deci, pentru ca produsul punctual dintre un rând și o coloană să fie valid – atunci când înmulțiți două matrici – ați avea nevoie ca ambele să aibă același număr de elemente.
  • În exemplul generic de mai sus, fiecare rând din matricea A are n elemente. Și fiecare coloană din matricea B are și n elemente.

Dacă aruncați o privire mai atentă, n este numărul de coloane din matricea A și este, de asemenea, numărul de rânduri din matricea B. Și tocmai acesta este motivul pentru care aveți nevoie ca numărul de coloane din matricea A să fie egal cu numărul de rânduri din matricea B.

  Cele mai bune 10 aplicații de cumpărare a caselor/vânătoare de case pentru 2023

Sper că înțelegeți condiția pentru ca înmulțirea matricei să fie validă și cum să obțineți fiecare element din matricea produsului.

Să începem să scriem niște cod Python pentru a multiplica două matrice.

Scrieți o funcție Python personalizată pentru a multiplica matrice

Ca prim pas, să scriem o funcție personalizată pentru a multiplica matrice.

Această funcție ar trebui să facă următoarele:

  • Acceptați două matrice, A și B, ca intrări.
  • Verificați dacă înmulțirea matriceală între A și B este validă.
  • Dacă este valid, înmulțiți cele două matrice A și B și returnați matricea de produs C.
  • În caz contrar, returnați un mesaj de eroare că matricele A și B nu pot fi multiplicate.

Pasul 1: Generați două matrice de numere întregi folosind funcția random.randint() a lui NumPy. De asemenea, puteți declara matrice ca liste Python imbricate.

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

Pasul 2: Continuați și definiți funcția multiplic_matrix(A,B). Această funcție ia ca intrări două matrice A și B și returnează matricea de produs C dacă înmulțirea matricei este validă.

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."

Analizarea definiției funcției

Să trecem la analizarea definiției funcției.

Declarați C ca variabilă globală: în mod implicit, toate variabilele din interiorul unei funcții Python au un domeniu de aplicare local. Și nu le puteți accesa din afara funcției. Pentru a face matricea produsului C accesibilă din exterior, va trebui să o declarăm ca variabilă globală. Doar adăugați calificativul global înainte de numele variabilei.

Verificați dacă înmulțirea matricei este validă: utilizați atributul formă pentru a verifica dacă A și B pot fi înmulțite. Pentru orice matrice arr, arr.shape[0] iar forma arr[1] dați numărul de rânduri și, respectiv, de coloane. Deci dacă A.forma[1] == B.forma[0] verifică dacă înmulțirea matricei este validă. Numai dacă această condiție este adevărată, matricea produsului va fi calculată. În caz contrar, funcția returnează un mesaj de eroare.

Utilizați bucle imbricate pentru a calcula valori: Pentru a calcula elementele matricei rezultante, trebuie să facem o buclă prin rândurile matricei A, iar bucla for externă face acest lucru. Bucla for interioară ne ajută să trecem prin coloana matricei B. Iar bucla for cea mai interioară ne ajută să accesăm fiecare element din coloana selectată.

▶️ Acum că am învățat cum funcționează funcția Python de înmulțire a matricelor, să numim funcția cu matricele A și B pe care le-am generat mai devreme.

multiply_matrix(A,B)

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

Deoarece înmulțirea matricei între A și B este validă, funcția multiplic_matrix() returnează matricea de produs C.

Utilizați Python Imbricat List Comprehension pentru a multiplica matrice

În secțiunea anterioară, ați scris o funcție Python pentru a multiplica matrice. Acum, veți vedea cum puteți utiliza listele de înțelegere imbricate pentru a face același lucru.

  Cât de precis este Apple Watch Calorie Burn Tracker?

Iată înțelegerea listei imbricate pentru a multiplica matrice.

La început, acest lucru poate părea complicat. Dar vom analiza înțelegerea listei imbricate pas cu pas.

Să ne concentrăm pe o singură listă de înțelegere la un moment dat și să identificăm ceea ce face.

Vom folosi următorul șablon general pentru înțelegerea listei:

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

▶️ Consultați ghidul nostru Înțelegerea listelor în Python – cu exemple pentru a obține o înțelegere aprofundată.

Înainte de a continua, vă rugăm să rețineți că am dori să construim matricea rezultată C pe rând.

Înțelegerea listei imbricate explicată

Pasul 1: Calculați o singură valoare în matricea C

Având în vedere rândul i al matricei A și coloana j a matricei B, expresia de mai jos oferă intrarea la indicele (i, j) în matricea 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

Dacă i = j = 1, expresia va returna intrarea c_11 din matricea C. Deci puteți obține un element într-un rând în acest fel.

Pasul 2: Construiți un rând în matricea C

Următorul nostru obiectiv este să construim un rând întreg.

Pentru rândul 1 din matricea A, trebuie să parcurgeți toate coloanele din matricea B pentru a obține un rând complet din matricea C.

Reveniți la șablonul de înțelegere a listei.

  • Înlocuiește cu expresia de la pasul 1, pentru că asta vrei să faci.
  • Apoi, înlocuiți cu B_col – fiecare coloană din matricea B.
  • În cele din urmă, înlocuiți cu zip(*B) – lista care conține toate coloanele din matricea B.

Și aici este prima înțelegere a listei.

[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

Pasul 3: Construiți toate rândurile și obțineți matricea C

În continuare, va trebui să populați matricea de produs C calculând restul rândurilor.

Și pentru aceasta, trebuie să parcurgeți toate rândurile din matricea A.

Reveniți la înțelegerea listei din nou și faceți următoarele.

  • Înlocuiți cu lista de înțelegere de la pasul 2. Amintiți-vă că am calculat un rând întreg în pasul anterior.
  • Acum, înlocuiți cu A_row – fiecare rând din matricea A.
  • Și dvs. este matricea A însăși, în timp ce treceți în buclă printre rândurile sale.

Și iată înțelegerea finală a listei imbricate.🎊

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

Este timpul să verificăm rezultatul! ✔

# cast into <a href="https://tipstrick.ro.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]]

Dacă aruncați o privire mai atentă, aceasta este echivalentă cu buclele for imbricate pe care le-am avut mai devreme – doar că este mai succint.

De asemenea, puteți face acest lucru cu atât mai eficient folosind unele funcții încorporate. Să aflăm despre ele în secțiunea următoare.

Utilizați NumPy matmul() pentru a multiplica matrice în Python

np.matmul() ia două matrice ca intrare și returnează produsul dacă înmulțirea matricei între matricele de intrare este validă.

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

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

Observați cum această metodă este mai simplă decât cele două metode pe care le-am învățat mai devreme. De fapt, în loc de np.matmul(), puteți folosi un operator @ echivalent și vom vedea asta imediat.

Cum se utilizează @ Operator în Python pentru a multiplica matrice

În Python, @ este un operator binar utilizat pentru înmulțirea matricei.

Funcționează pe două matrice și, în general, pe tablouri N-dimensionale NumPy și returnează matricea produsului.

Notă: Trebuie să aveți Python 3.5 și o versiune ulterioară pentru a utiliza operatorul @.

Iată cum îl puteți folosi.

C = [email protected]
print(C)

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

Observați că matricea produsului C este aceeași cu cea pe care am obținut-o mai devreme.

Puteți folosi np.dot() pentru a multiplica matrice?

Dacă ați întâlnit vreodată cod care folosește np.dot() pentru a multiplica două matrice, iată cum funcționează.

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

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

Veți vedea că np.dot(A, B) returnează și matricea produsului așteptat.

Cu toate acestea, conform NumPy docsar trebui să utilizați np.dot() numai pentru a calcula produsul scalar al doi vectori unidimensionali și nu pentru multiplicarea matricei.

Reamintim din secțiunea anterioară, elementul de la indicele (i, j) al matricei de produs C este produsul scalar al rândului i al matricei A și coloana j a matricei B.

Deoarece NumPy transmite implicit această operație de produs punctual către toate rândurile și toate coloanele, obțineți matricea de produs rezultată. Dar pentru a vă menține codul lizibil și pentru a evita ambiguitatea, utilizați în schimb np.matmul() sau operatorul @.

Concluzie

🎯 În acest tutorial, ați învățat următoarele.

  • Condiția pentru ca înmulțirea matricei să fie valabilă: numărul de coloane din matricea A = numărul de rânduri din matricea B.
  • Cum se scrie o funcție personalizată Python care verifică dacă înmulțirea matricei este validă și returnează matricea produsului. Corpul funcției folosește bucle imbricate for.
  • Apoi, ați învățat cum să utilizați listele de înțelegere imbricate pentru a multiplica matrice. Sunt mai succinte decât buclele for, dar sunt predispuse la probleme de lizibilitate.
  • În cele din urmă, ați învățat să utilizați funcția încorporată NumPy np.matmul() pentru a multiplica matrice și cum aceasta este cea mai eficientă din punct de vedere al vitezei.
  • Ați învățat și despre operatorul @ pentru a multiplica două matrice în Python.

Și asta încheie discuția noastră despre înmulțirea matricelor în Python. Ca pas următor, aflați cum să verificați dacă un număr este prim în Python. Sau rezolvați probleme interesante pe șiruri Python.

Învățare fericită!🎉