NumPy dot vs matmul en Python

Manav Narula 12 avril 2021
NumPy dot vs matmul en Python

En Python, les tableaux sont traités comme des vecteurs. Les tableaux 2D sont également appelés matrices. Nous avons des fonctions disponibles pour effectuer la multiplication entre elles en Python. Les deux méthodes utilisées sont la fonction numpy.dot() et l’opérateur @ (méthode __matmul__ du tableau). Maintenant, il peut sembler qu’ils remplissent tous les deux la même fonction de multiplication. Cependant, il existe une différence entre les deux, qui est expliquée dans ce didacticiel.

La fonction numpy.dot() est utilisée pour effectuer une multiplication matricielle en Python. Il vérifie également la condition de multiplication de la matrice, c’est-à-dire que le nombre de colonnes de la première matrice doit être égal au nombre de lignes de la seconde. Il fonctionne également avec des tableaux multidimensionnels. Nous pouvons également spécifier un autre tableau en tant que paramètre pour stocker le résultat. L’opérateur @ de multiplication invoque la fonction matmul() d’un tableau utilisé pour effectuer la même multiplication. Par exemple,

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)

Production:

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

Cependant, lorsque nous traitons des tableaux multidimensionnels (tableaux N-D avec N>2), le résultat est légèrement différent. Vous pouvez voir la différence ci-dessous.

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)

Production:

[[[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 fonction matmul() diffuse le tableau comme une pile de matrices comme des éléments résidant respectivement dans les deux derniers index. La fonction numpy.dot(), quant à elle, effectue la multiplication comme la somme des produits sur le dernier axe du premier tableau et l’avant-dernier du second.

Une autre différence entre la fonction matmul() et la fonction numpy.dot est que la fonction matmul() ne peut pas effectuer de multiplication de tableau avec des valeurs scalaires.

Auteur: 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