Selles näites õpime maatrikseid korrutama kahel erineval viisil: sisestatud silmus ja sisestatud loendi tihendamine
Selle näite mõistmiseks peaksid teil olema teadmised järgmistest Pythoni programmeerimise teemadest:
- Python for Loop
- Pythoni loend
- Pythoni maatriksid ja NumPy massiivid
Pythonis saame maatriksi rakendada pesastatud loendina (loend loendis).
Iga elementi võime käsitleda maatriksi reana.
Näiteks X = ((1, 2), (4, 5), (3, 6))
tähistaks 3x2
maatriksit.
Esimese rea saab valida järgmiselt X(0)
. Ja esimese rea esimese veeru elemendi saab valida järgmiselt X(0)(0)
.
Kahe maatriksi X ja Y korrutamine on määratletud ainult siis, kui veergude arv X-is on võrdne ridade Y-ga.
Kui X on n x m
maatriks ja Y on m x l
maatriks, siis on XY määratletud ja sellel on mõõde n x l
(kuid YX pole määratletud). Siin on paar viisi maatriksi korrutamise rakendamiseks Pythonis.
Lähtekood: Maatriksi korrutamine pesastatud silmuse abil
# 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)
Väljund
(114, 160, 60, 27) (74, 97, 73, 14) (119, 157, 112, 23)
Selles programmis oleme for
iga rea ja iga veeru kordamiseks kasutanud pesastatud silmuseid. Tulemuses koguneb toodete summa.
See meetod on lihtne, kuid arvutuslikult kallis, kuna suurendame maatriksi järjekorda.
Suuremate maatriksitehingute jaoks soovitame optimeeritud tarkvarapakette nagu NumPy, mis on mitu (suurusjärgus 1000) korda kiirem kui ülaltoodud kood.
Lähtekood: Maatriksite korrutamine pesastatud loendi mõistmise abil
# 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)
Selle programmi väljund on sama, mis ülal. Ülaltoodud koodi mõistmiseks peame kõigepealt teadma sisseehitatud funktsiooni zip()
ja argumentide loendi lahtipakkimist operaatori * abil.
Maatriksi iga elemendi kordamiseks oleme kasutanud pesastatud loendi mõistmist. Kood näib esialgu keeruline ja loetamatu. Kuid kui olete loendi mõistmise hõlpsalt kokku puutunud, ei lähe te tõenäoliselt pesastatud tsüklite juurde.