Šajā piemērā mēs iemācīsimies reizināt matricas, izmantojot divus dažādus veidus: ligzdoto cilpu un ligzdoto sarakstu pilnveidošanu
Lai saprastu šo piemēru, jums jābūt zināšanām par šādām Python programmēšanas tēmām:
- Python for Loop
- Python saraksts
- Python matricas un NumPy masīvi
Programmā Python mēs varam ieviest matricu kā ligzdotu sarakstu (saraksts saraksta iekšpusē).
Mēs varam traktēt katru elementu kā matricas rindu.
Piemēram, X = ((1, 2), (4, 5), (3, 6))
tas pārstāv 3x2
matricu.
Pirmo rindu var izvēlēties kā X(0)
. Pirmās rindas pirmās kolonnas elementu var izvēlēties kā X(0)(0)
.
Divu matricu X un Y reizināšana ir definēta tikai tad, ja kolonnu skaits X ir vienāds ar Y rindu skaitu.
Ja X ir n x m
matrica un Y ir m x l
matrica, tad XY ir definēts un tam ir dimensija n x l
(bet YX nav definēts). Šeit ir pāris veidi, kā ieviest matricas reizināšanu Python.
Avota kods: Matricas reizināšana, izmantojot ligzdoto cilpu
# 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)
Rezultāts
(114., 160., 60., 27.) (74., 97., 73., 14.) (119., 157., 112., 23.)
Šajā programmā mēs esam izmantojuši ligzdotas for
cilpas, lai atkārtotu katru rindu un katru kolonnu. Rezultātā mēs uzkrājam produktu summu.
Šī metode ir vienkārša, bet skaitļošanas ziņā dārga, jo mēs palielinām matricas kārtību.
Lielākām matricas operācijām mēs iesakām optimizētus programmatūras paketus, piemēram, NumPy, kas ir vairākas reizes (1000 secībā) reizes ātrāks nekā iepriekš minētais kods.
Avota kods: Matricas reizināšana, izmantojot izpratni par ligzdotu sarakstu
# 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)
Šīs programmas rezultāts ir tāds pats kā iepriekš. Lai saprastu iepriekš minēto kodu, vispirms mums jāzina par iebūvēto funkciju zip()
un argumentu saraksta izpakošanu, izmantojot * operatoru.
Mēs esam izmantojuši ligzdotu sarakstu izpratni, lai atkārtotu katru matricas elementu. Sākumā kods izskatās sarežģīts un neizlasāms. Bet, tiklīdz būsit izpratis saraksta izpratni, jūs, iespējams, neatgriezīsities pie ligzdotajām cilpām.