NumPy dot vs matmul in Python

Manav Narula 30 marzo 2021
NumPy dot vs matmul in Python

In Python, gli array vengono trattati come vettori. Gli array 2-D sono anche chiamati matrici. Abbiamo funzioni disponibili per eseguire la moltiplicazione tra di loro in Python. I due metodi usati sono la funzione numpy.dot() e l’operatore @ (il metodo __matmul__ dell’array). Ora può sembrare che entrambi svolgano la stessa funzione di moltiplicazione. Tuttavia, c’è qualche differenza tra entrambi, che viene spiegata in questo tutorial.

La funzione numpy.dot() è usata per eseguire la moltiplicazione di matrici in Python. Controlla anche la condizione per la moltiplicazione di matrici, ovvero il numero di colonne della prima matrice deve essere uguale al numero di righe della seconda. Funziona anche con array multidimensionali. Possiamo anche specificare un array alternativo come parametro per memorizzare il risultato. L’operatore @ per la moltiplicazione invoca la funzione matmul() di un array che è usato per eseguire la stessa moltiplicazione. Per esempio,

import numpy as np

a = np.array([[1, 2], [2, 3]])
b = np.array(([8, 4], [4, 7]))
print(np.dot(a, b))
print(a @ b)

Produzione:

[[16 18]
 [28 29]]
[[16 18]
 [28 29]]

Tuttavia, quando abbiamo a che fare con array multidimensionali (array N-D con N> 2) il risultato è leggermente diverso. Puoi vedere la differenza di seguito.

a = np.random.rand(2, 3, 3)
b = np.random.rand(2, 3, 3)
c = a @ b
d = np.dot(a, b)
print(c, c.shape)
print(d, d.shape)

Produzione:

[[[0.63629871 0.55054463 0.22289276]
  [1.27578425 1.13950519 0.55370078]
  [1.37809353 1.32313811 0.75460862]]

 [[1.63546361 1.54607801 0.67134528]
  [1.05906619 1.07509384 0.42526795]
  [1.38932102 1.32829749 0.47240808]]] (2, 3, 3)
[[[[0.63629871 0.55054463 0.22289276]
   [0.7938068  0.85668481 0.26504028]]

  [[1.27578425 1.13950519 0.55370078]
   [1.55589497 1.45794424 0.5335743 ]]

  [[1.37809353 1.32313811 0.75460862]
   [1.60564885 1.39494713 0.59370927]]]


 [[[1.48529826 1.55580834 0.96142976]
   [1.63546361 1.54607801 0.67134528]]

  [[0.94601586 0.97181894 0.56701004]
   [1.05906619 1.07509384 0.42526795]]

  [[1.13268609 1.00262696 0.47226983]
   [1.38932102 1.32829749 0.47240808]]]] (2, 3, 2, 3)

La funzione matmul() trasmette l’array come una pila di matrici come elementi che risiedono negli ultimi due indici, rispettivamente. La funzione numpy.dot(), d’altra parte, esegue la moltiplicazione come la somma dei prodotti sull’ultimo asse del primo array e il penultimo del secondo.

Un’altra differenza tra la funzione matmul() e la funzione numpy.dot è che la funzione matmul() non può eseguire la moltiplicazione di array con valori scalari.

Autore: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn