W tym przykładzie nauczymy się mnożyć macierze na dwa różne sposoby: zagnieżdżoną pętlę i zagnieżdżoną listę
Aby zrozumieć ten przykład, powinieneś znać następujące tematy programowania w Pythonie:
- Python for Loop
- Lista Pythona
- Macierze Pythona i tablice NumPy
W Pythonie możemy zaimplementować macierz jako listę zagnieżdżoną (lista wewnątrz listy).
Każdy element możemy traktować jako wiersz macierzy.
Na przykład X = ((1, 2), (4, 5), (3, 6))
reprezentowałby 3x2
macierz.
Pierwszy wiersz można wybrać jako X(0)
. I element w pierwszym wierszu, pierwszej kolumnie można wybrać jako X(0)(0)
.
Mnożenie dwóch macierzy X i Y jest określone tylko wtedy, gdy liczba kolumn w X jest równa liczbie wierszy Y.
Jeśli X jest n x m
macierzą, a Y jest m x l
macierzą, to XY jest zdefiniowane i ma wymiar n x l
(ale YX nie jest zdefiniowane). Oto kilka sposobów implementacji mnożenia macierzy w Pythonie.
Kod źródłowy: mnożenie macierzy za pomocą pętli zagnieżdżonej
# 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)
Wynik
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
W tym programie użyliśmy zagnieżdżonych for
pętli do iteracji po każdym wierszu i każdej kolumnie. W wyniku kumulujemy sumę produktów.
Ta technika jest prosta, ale kosztowna obliczeniowo, ponieważ zwiększamy kolejność macierzy.
W przypadku większych operacji na macierzach zalecamy zoptymalizowane pakiety oprogramowania, takie jak NumPy, które są kilka (w kolejności 1000) razy szybsze niż powyższy kod.
Kod źródłowy: mnożenie macierzy przy użyciu funkcji rozumienia list zagnieżdżonych
# 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)
Wynik tego programu jest taki sam jak powyżej. Aby zrozumieć powyższy kod, musimy najpierw wiedzieć o funkcji wbudowanej zip()
i rozpakowaniu listy argumentów za pomocą operatora *.
Użyliśmy zagnieżdżonego przetwarzania list, aby iterować po każdym elemencie macierzy. Na początku kod wygląda na skomplikowany i nieczytelny. Ale kiedy już opanujesz rozumienie list, prawdopodobnie nie wrócisz do zagnieżdżonych pętli.