La multiplicació de matrius és una operació fonamental en àlgebra lineal.
En general, l'utilitzem en nombroses aplicacions, com ara processament d'imatges, aprenentatge automàtic i moltes més. NumPy és un paquet Python notable per a la informàtica científica.
Tanmateix, en aquesta publicació, veurem diversos mètodes per fer la multiplicació de matrius a Python sense utilitzar NumPy.
Utilitzarem bucles imbricats, la funció integrada map() i la comprensió de llistes.
A més, analitzarem els beneficis i els inconvenients de cada estratègia, així com quan aplicar-les. Si sou nou a l'àlgebra lineal i voleu aprendre més sobre la multiplicació de matrius; segueix llegint.
On utilitzem la multiplicació matricial?
S'utilitza la multiplicació de matrius grafics d'ordinador per alterar imatges 2D i 3D. Per exemple, podeu girar, escalar i traduir objectes a la pantalla. Les matrius s'utilitzen en el processament d'imatges per representar imatges com matrius de píxels. A més, les matrius es poden utilitzar per dur a terme operacions com el filtratge d'imatges.
També fem ús de matrius en màquina d'aprenentatge. Ens poden ajudar a representar dades i paràmetres de model. Podem dur a terme nombroses operacions, com ara el càlcul de productes puntuals i productes de matriu-vector.
Segurament, aquesta operació també és molt avantatjosa en operacions científiques. El podem utilitzar en física i enginyeria per descriure magnituds físiques. Per tant, podem operar amb vectors i tensors.
Per què no podem triar utilitzar NumPy?
Mentre que NumPy és un Biblioteca Python, no sempre és l'opció ideal per a la multiplicació de matrius. És possible que no optem per utilitzar NumPy per raons com ara la mida i la dependència, l'aprenentatge i els sistemes heretats.
L'ús de les funcions integrades de Python o el desenvolupament de codi personalitzat pot ser més eficient en alguns casos. Tanmateix, és crucial tenir en compte que NumPy és una biblioteca forta. A més, també el podeu utilitzar per a la multiplicació de matrius.
Ara, fem una ullada a com podem aconseguir la multiplicació de matrius sense NumPy.
Mètode de bucles imbricats
La tècnica de bucles imbricats utilitza bucles imbricats per executar la multiplicació de matrius a Python. La funció itera sobre cada element de la matriu. I, els multiplica mitjançant una sèrie de bucles imbricats. La funció retorna el resultat, que s'emmagatzema en una nova matriu.
Aquest enfocament és senzill d'entendre. Tanmateix, pot ser que no sigui tan eficient com altres maneres, especialment per a matrius més grans. Tanmateix, és una opció meravellosa per a vosaltres si sou nou a l'àlgebra lineal.
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])
# Estableix la matriu de resultats en zeros.
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
Anem a tenir un exemple de com fer-ho. Només podeu afegir aquestes línies de codi a continuació per provar aquest exemple.
# 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]]
Beneficis:
- Fàcil d'entendre.
- Ideal per a principiants o per a aquells que busquen una comprensió més profunda de la multiplicació de matrius.
Desavantatges:
- No és tan eficaç com les tècniques alternatives, especialment per a matrius més grans.
- No és tan llegible com els enfocaments alternatius.
Mètode de la funció map().
El mètode de la funció map() proporciona un enfocament alternatiu per fer la multiplicació de matrius a Python. En aquest enfocament, utilitzem la funció map() integrada. Per tant, utilitzem una eina de programació funcional que aplica una funció proporcionada a cada element iterable (llista, tupla, etc.). A més, la funció map() accepta dos paràmetres, una funció i un iterable. I, retorna un iterador que aplica la funció a cada element iterable.
En aquest enfocament, repassem cada membre de la matriu i fem la multiplicació mitjançant la funció map() imbricada.
La funció zip() s'utilitza per iterar per cada element de les matrius en paral·lel.
Finalment, s'utilitza la funció sum() per sumar els resultats.
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
Ara, de nou, podem provar el nostre codi amb un exemple.
# 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]]
avantatges
- Més eficaç que l'enfocament de bucles apilats
- Utilitza programació funcional per simplificar el codi.
Desavantatges
- Algunes persones que no estan familiaritzades amb la programació funcional poden trobar-la menys llegible.
- És menys comprensible que la tècnica de bucles imbricats.
Mètode de comprensió de llista
La comprensió de llistes us permet generar una llista nova en una única línia de codi. Per tant, això és aplicant una expressió a cada membre d'una llista existent.
En aquest enfocament, la multiplicació es porta a terme iterant repetidament cada membre de la matriu. Estem utilitzant la comprensió de llistes en capes.
# 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]]
Beneficis
- En comparació amb el mètode de la funció map(), més curt i més llegible.
Desavantatges
- Pot ser menys eficaç que utilitzar la funció map(), especialment per a matrius grans.
- És més difícil que l'enfocament de bucles imbricats.
Conclusió
En aquesta publicació, vam analitzar alternatives a l'ús de NumPy quan es multipliquen matrius a Python. Hem realitzat la multiplicació de matrius en bucles imbricats, la funció integrada map() i la comprensió de llistes.
La millor estratègia dependrà de les necessitats particulars del vostre projecte.
Cadascuna de les estratègies té pros i contres propis. Per assegurar-vos que la funció funciona correctament, és una bona idea afegir alguns casos de prova amb diferents dimensions i valors de matriu.
També hauríeu d'incloure algunes proves de rendiment per comparar com s'executen aquests mètodes.
Deixa un comentari