I det här exemplet lär vi oss att multiplicera matriser på två olika sätt: kapslad slinga och kapslad lista
För att förstå detta exempel bör du ha kunskap om följande Python-programmeringsämnen:
- Python for Loop
- Python List
- Python-matriser och NumPy-matriser
I Python kan vi implementera en matris som kapslad lista (lista i en lista).
Vi kan behandla varje element som en rad i matrisen.
Till exempel X = ((1, 2), (4, 5), (3, 6))
skulle representera en 3x2
matris.
Den första raden kan väljas som X(0)
. Och elementet i första raden, första kolumnen kan väljas som X(0)(0)
.
Multiplikation av två matriser X och Y definieras endast om antalet kolumner i X är lika med antalet rader Y.
Om X är en n x m
matris och Y är en m x l
matris definieras XY och har dimensionen n x l
(men YX är inte definierad). Här är ett par sätt att implementera matrismultiplikation i Python.
Källkod: Matrix Multiplication using 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)
Produktion
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
I det här programmet har vi använt kapslade for
slingor för att itera igenom varje rad och varje kolumn. Vi ackumulerar summan av produkter i resultatet.
Denna teknik är enkel men beräkningsmässigt dyr eftersom vi ökar ordningen på matrisen.
För större matrisoperationer rekommenderar vi optimerade mjukvarupaket som NumPy som är flera (i storleksordningen 1000) gånger snabbare än ovanstående kod.
Källkod: Matrismultiplikation med hjälp av kapslad listförstå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 för detta program är detsamma som ovan. För att förstå ovanstående kod måste vi först veta om inbyggd funktion zip()
och uppackning av argumentlistan med * -operatören.
Vi har använt kapslad listförståelse för att itera igenom varje element i matrisen. Koden ser komplicerad och oläslig ut först. Men när du förstår listförståelserna kommer du förmodligen inte att gå tillbaka till kapslade öglor.