Maticové násobení je základní operace v lineární algebře.
Obecně jej používáme v mnoha aplikacích, jako je zpracování obrazu, strojové učení a mnoho dalších. NumPy je pozoruhodný balík Pythonu pro vědecké výpočty.
V tomto příspěvku se však podíváme na různé metody pro násobení matic v Pythonu bez použití NumPy.
Budeme využívat vnořené smyčky, vestavěná funkce map() a porozumění seznamu.
Kromě toho se podíváme na výhody a nevýhody každé strategie a také na to, kdy každou z nich použít. Pokud jste nováčkem v lineární algebře a chcete se dozvědět více o násobení matic; pokračuj ve čtení.
Kde používáme násobení matic?
Používá se maticové násobení počítačová grafika ke změně 2D a 3D vizuálů. Můžete například otáčet, měnit měřítko a překládat objekty na obrazovce. Matice se používají při zpracování obrazu k reprezentaci obrázků jako pole pixelů. Kromě toho lze matice použít k provádění operací, jako je filtrování obrazu.
Využíváme také matrice v strojové učení. Mohou nám pomoci reprezentovat data a parametry modelu. Můžeme provádět řadu operací, jako je výpočet bodových produktů a produktů maticových vektorů.
Tato operace je jistě velmi výhodná i ve vědeckých operacích. Můžeme jej použít ve fyzice a inženýrství k popisu fyzikálních veličin. Můžeme tedy pracovat s vektory a tenzory.
Proč se nemůžeme rozhodnout používat NumPy?
Zatímco NumPy je a Knihovna Python, není to vždy ideální možnost pro násobení matic. Nemusíme se rozhodnout používat NumPy z důvodů, jako je velikost a závislost, učení a starší systémy.
Použití vestavěných funkcí Pythonu nebo vývoj vlastního kódu může být v některých případech efektivnější. Je však důležité poznamenat, že NumPy je silná knihovna. Kromě toho jej můžete použít také pro násobení matic.
Nyní se podívejme na to, jak můžeme dosáhnout násobení matic bez NumPy.
Metoda vnořených smyček
Technika vnořených smyček používá vnořené smyčky k provádění násobení matic v Pythonu. Funkce iteruje přes každý prvek matice. A násobí je pomocí řady vnořených smyček. Funkce vrátí výsledek, který je uložen v nové matici.
Tento přístup je snadno pochopitelný. Nemusí však být tak efektivní jako jiné způsoby, zejména pro větší matice. Přesto je to skvělá volba pro vás, pokud jste nováčkem v lineární algebře.
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ýslednou matici 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 příklad, jak to udělat. Chcete-li tento příklad otestovat, stačí přidat tyto řádky kódu níže.
# 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:
- Snadno pochopitelné.
- Skvělé pro nováčky nebo ty, kteří hledají hlubší pochopení násobení matice.
Nevýhody:
- Není tak efektivní jako alternativní techniky, zejména u větších matric.
- Není tak čitelný jako alternativní přístupy.
metoda funkce map().
Funkce map() poskytuje alternativní přístup pro násobení matic v Pythonu. V tomto přístupu používáme vestavěnou funkci map(). Proto používáme funkční programovací nástroj, který aplikuje poskytnutou funkci na každý iterovatelný prvek (seznam, n-tice atd.). Funkce map() také přijímá dva parametry, funkci a iterovatelnou. A vrací iterátor, který aplikuje funkci na každý iterovatelný prvek.
V tomto přístupu procházíme každý člen matice a provádíme násobení pomocí vnořené funkce map().
Funkce zip() se používá k paralelnímu iterování každého prvku matic.
Nakonec se k sečtení výsledků použije funkce 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
Nyní opět můžeme otestovat náš kód na příkladu.
# 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
- Efektivnější než přístup složených smyček
- Pro zjednodušení kódu používá funkční programování.
Nevýhody
- Některým lidem, kteří nejsou obeznámeni s funkčním programováním, se může zdát méně čitelné.
- Je to méně srozumitelné než technika vnořených smyček.
Metoda porozumění seznamu
Porozumění seznamu vám umožňuje vygenerovat nový seznam v jediném řádku kódu. Jedná se tedy o aplikaci výrazu na každého člena existujícího seznamu.
V tomto přístupu se násobení provádí opakovaným opakováním každého člena matice. Používáme vrstvené porozumění seznamu.
# 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
- Oproti metodě funkce map() kratší a čitelnější.
Nevýhody
- Může to být méně efektivní než použití funkce map(), zejména pro velké matice.
- Je to obtížnější než přístup vnořených smyček.
Proč investovat do čističky vzduchu?
V tomto příspěvku jsme se podívali na alternativy k použití NumPy při násobení matic v Pythonu. Provedli jsme násobení matic ve vnořených cyklech, vestavěnou funkci map() a porozumění seznamu.
Nejlepší strategie se bude spoléhat na konkrétní potřeby vašeho projektu.
Každá ze strategií má své pro a proti. Abyste se ujistili, že funkce funguje správně, je dobré přidat několik testovacích případů s různými rozměry a hodnotami matice.
Měli byste také zahrnout některé testy výkonu, abyste porovnali, jak dobře se tyto metody provádějí.
Napsat komentář