I dette eksemplet vil vi lære å multiplisere matriser på to forskjellige måter: nestet løkke og nestet listekompensasjon
For å forstå dette eksemplet, bør du ha kunnskap om følgende Python-programmeringsemner:
- Python for Loop
- Python-liste
- Python-matriser og NumPy-matriser
I Python kan vi implementere en matrise som nestet liste (liste inne i en liste).
Vi kan behandle hvert element som en rad av matrisen.
For eksempel X = ((1, 2), (4, 5), (3, 6))
vil representere en 3x2
matrise.
Den første raden kan velges som X(0)
. Og elementet i første rad, første kolonne kan velges som X(0)(0)
.
Multiplikasjon av to matriser X og Y defineres bare hvis antall kolonner i X er lik antall rader Y.
Hvis X er en n x m
matrise og Y er en m x l
matrise, er XY definert og har dimensjonen n x l
(men YX er ikke definert). Her er et par måter å implementere matrisemultiplikasjon i Python på.
Kildekode: Matriksmultiplikasjon ved hjelp av Nested Loop
# Program to multiply two matrices using nested loops # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((0,0,0,0), (0,0,0,0), (0,0,0,0)) # iterate through rows of X for i in range(len(X)): # iterate through columns of Y for j in range(len(Y(0))): # iterate through rows of Y for k in range(len(Y)): result(i)(j) += X(i)(k) * Y(k)(j) for r in result: print(r)
Produksjon
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
I dette programmet har vi brukt nestede for
sløyfer for å gjenta gjennom hver rad og hver kolonne. Vi akkumulerer summen av produkter i resultatet.
Denne teknikken er enkel, men beregningsdyr når vi øker rekkefølgen på matrisen.
For større matriseoperasjoner anbefaler vi optimaliserte programvarepakker som NumPy, som er flere (i størrelsesorden 1000) ganger raskere enn koden ovenfor.
Kildekode: Matriksmultiplikasjon ved hjelp av nestet listeforståelse
# Program to multiply two matrices using list comprehension # 3x3 matrix X = ((12,7,3), (4 ,5,6), (7 ,8,9)) # 3x4 matrix Y = ((5,8,1,2), (6,7,3,0), (4,5,9,1)) # result is 3x4 result = ((sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)) for X_row in X) for r in result: print(r)
Resultatet av dette programmet er det samme som ovenfor. For å forstå koden ovenfor må vi først vite om innebygd funksjon zip()
og utpakking av argumentliste ved hjelp av * operator.
Vi har brukt nestet listeforståelse for å gjenta gjennom hvert element i matrisen. Koden ser først komplisert og uleselig ut. Men når du først har fått tak i listeforståelsen, vil du sannsynligvis ikke gå tilbake til nestede sløyfer.