NumPy dot vs matmul en Python

Manav Narula 19 octubre 2021
NumPy dot vs matmul en Python

En Python, los Arrays se tratan como vectores. Las matrices 2-D también se denominan matrices. Disponemos de funciones para realizar multiplicaciones entre ellas en Python. Los dos métodos utilizados son la función numpy.dot() y el operador @ (el método __matmul__ del array). Ahora bien, puede parecer que ambos realizan la misma función de multiplicación. Sin embargo, hay alguna diferencia entre ambos, que se explica en este tutorial.

La función numpy.dot() se utiliza para realizar la multiplicación de matrices en Python. También verifica la condición para la multiplicación de matrices, es decir, el número de columnas de la primera array debe ser igual al número de filas de la segunda. También funciona con matrices multidimensionales. También podemos especificar un array alternativa como parámetro para almacenar el resultado. El operador @ para la multiplicación invoca la función matmul() de un array que se utiliza para realizar la misma multiplicación. Por ejemplo,

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)

Producción :

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

Sin embargo, cuando tratamos con matrices multidimensionales (matrices N-D con N> 2) el resultado es ligeramente diferente. Puedes ver la diferencia a continuación.

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)

Producción :

[[[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 función matmul() transmite el array como una pila de matrices como elementos que residen en los dos últimos índices, respectivamente. La función numpy.dot(), por otro lado, realiza la multiplicación como la suma de productos sobre el último eje de la primer array y el penúltimo del segundo.

Otra diferencia entre la función matmul() y la función numpy.dot es que la función matmul() no puede realizar la multiplicación de arrays con valores escalares.

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