Násobenie matice je základná operácia v lineárnej algebre.
Vo všeobecnosti ho používame v mnohých aplikáciách, ako je spracovanie obrazu, strojové učenie a mnoho ďalších. NumPy je pozoruhodný balík Pythonu pre vedecké výpočty.
V tomto príspevku sa však pozrieme na rôzne metódy násobenia matíc v Pythone bez použitia NumPy.
Využijeme vnorené slučky, vstavaná funkcia map() a porozumenie zoznamu.
Okrem toho sa pozrieme na výhody a nevýhody každej stratégie, ako aj na to, kedy použiť každú z nich. Ak ste nováčikom v lineárnej algebre a chcete sa dozvedieť viac o násobení matíc; pokračuj v čítaní.
Kde používame maticové násobenie?
Maticové násobenie sa používa v počítačová grafika na zmenu 2D a 3D vizuálov. Môžete napríklad otáčať, meniť mierku a prekladať objekty na obrazovke. Matice sa používajú pri spracovaní obrazu na reprezentáciu obrázkov ako polí pixelov. Okrem toho môžu byť matice použité na vykonávanie operácií, ako je filtrovanie obrazu.
Používame aj matrice v strojové učenie. Môžu nám pomôcť reprezentovať dáta a parametre modelu. Môžeme vykonávať množstvo operácií, ako je výpočet bodových produktov a produktov maticových vektorov.
Táto operácia je určite veľmi výhodná aj vo vedeckých operáciách. Môžeme ho použiť vo fyzike a inžinierstve na opis fyzikálnych veličín. Preto môžeme pracovať s vektormi a tenzormi.
Prečo sa nemôžeme rozhodnúť používať NumPy?
Zatiaľ čo NumPy je a Knižnica Python, nie je to vždy ideálna možnosť pre maticové násobenie. Nemusíme sa rozhodnúť používať NumPy z dôvodov, ako je veľkosť a závislosť, učenie a staršie systémy.
Používanie vstavaných funkcií Pythonu alebo vývoj vlastného kódu môže byť v niektorých prípadoch efektívnejšie. Je však dôležité poznamenať, že NumPy je silná knižnica. Okrem toho ho môžete použiť aj na násobenie matíc.
Teraz sa pozrime na to, ako môžeme dosiahnuť násobenie matice bez NumPy.
Metóda vnorených slučiek
Technika vnorených slučiek využíva vnorené cykly na vykonávanie násobenia matíc v Pythone. Funkcia iteruje cez každý prvok matice. A násobí ich pomocou série vnorených slučiek. Funkcia vráti výsledok, ktorý sa uloží do novej matice.
Tento prístup je jednoduché pochopiť. Nemusí to však byť také efektívne ako iné spôsoby, najmä pre väčšie matice. Napriek tomu je to skvelá voľba pre vás, ak ste nováčikom v lineárnej algebre.
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# Nastavte výslednú maticu na nuly.
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
Uveďme si príklad, ako to urobiť. Ak chcete otestovať tento príklad, stačí pridať tieto riadky kódu nižšie.
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
Výhody:
- Ľahko pochopiteľné.
- Skvelé pre nováčikov alebo tých, ktorí hľadajú hlbšie pochopenie násobenia matice.
Nevýhody:
- Nie sú také účinné ako alternatívne techniky, najmä pre väčšie matrice.
- Nie je taký čitateľný ako alternatívne prístupy.
metóda funkcie map().
Metóda funkcie map() poskytuje alternatívny prístup na násobenie matíc v Pythone. V tomto prístupe používame vstavanú funkciu map(). Preto používame funkčný programovací nástroj, ktorý aplikuje poskytnutú funkciu na každý iterovateľný prvok (zoznam, n-tica atď.). Tiež funkcia map() akceptuje dva parametre, funkciu a iterovateľné. A vráti iterátor, ktorý aplikuje funkciu na každý iterovateľný prvok.
V tomto prístupe prechádzame každým členom matice a násobíme pomocou funkcie vnorenej map().
Funkcia zip() sa používa na paralelné iterovanie cez každý prvok matíc.
Nakoniec sa na sčítanie výsledkov použije funkcia sum().
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
Teraz opäť môžeme otestovať náš kód na príklade.
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
výhody
- Efektívnejšie ako prístup stohovaných slučiek
- Na zjednodušenie kódu využíva funkčné programovanie.
Nevýhody
- Niektorým ľuďom, ktorí nie sú oboznámení s funkčným programovaním, sa môže zdať menej čitateľné.
- Je to menej zrozumiteľné ako technika vnorených slučiek.
Metóda porozumenia zoznamu
Porozumenie zoznamu vám umožňuje vygenerovať nový zoznam v jednom riadku kódu. Ide teda o aplikáciu výrazu na každého člena existujúceho zoznamu.
V tomto prístupe sa násobenie vykonáva opakovaným opakovaním cez každý člen matice. Používame vrstvené porozumenie zoznamu.
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
Výhody
- V porovnaní s metódou funkcie map() kratšia a čitateľnejšia.
Nevýhody
- Môže to byť menej efektívne ako použitie funkcie map(), najmä pre veľké matice.
- Je to ťažšie ako prístup vnorených slučiek.
záver
V tomto príspevku sme sa pozreli na alternatívy použitia NumPy pri násobení matíc v Pythone. Vykonali sme násobenie matíc vo vnorených slučkách, vstavanú funkciu map() a porozumenie zoznamu.
Najlepšia stratégia sa bude opierať o konkrétne potreby vášho projektu.
Každá zo stratégií má svoje klady a zápory. Aby ste sa uistili, že funkcia funguje správne, je dobré pridať niekoľko testovacích prípadov s rôznymi rozmermi a hodnotami matice.
Mali by ste tiež zahrnúť niektoré testy výkonu, aby ste porovnali, ako dobre sa tieto metódy vykonávajú.
Nechaj odpoveď