NumPy dot vs matmul em Python

Manav Narula 6 abril 2021
NumPy dot vs matmul em Python

Em Python, os arrays são tratados como vetores. As arrays 2-D também são chamadas de arrays. Temos funções disponíveis para realizar a multiplicação entre eles em Python. Os dois métodos usados ​​são a função numpy.dot() e o operador @ (o método __matmul__ do array). Agora, pode parecer que ambos desempenham a mesma função de multiplicação. No entanto, há alguma diferença entre os dois, que é explicada neste tutorial.

A função numpy.dot() é usada para realizar a multiplicação de arrays em Python. Também verifica a condição de multiplicação do array, ou seja, o número de colunas da primeira matriz deve ser igual ao número de linhas da segunda. Ele também funciona com arrays multidimensionais. Também podemos especificar un array alternativa como parâmetro para armazenar o resultado. O operador @ para multiplicação invoca a função matmul() de un array que é usada para realizar a mesma multiplicação. Por exemplo,

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)

Resultado:

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

No entanto, quando lidamos com arrays multidimensionais (arrays N-D com N> 2), o resultado é ligeiramente diferente. Você pode ver a diferença abaixo.

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)

Resultado:

[[[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)

A função matmul() transmite a matriz como uma pilha de arrays como elementos que residem nos dois últimos índices, respectivamente. A função numpy.dot(), por outro lado, executa a multiplicação como a soma dos produtos sobre o último eixo do primeiro array e o penúltimo do segundo.

Outra diferença entre a função matmul() e a função numpy.dot é que a função matmul() não pode realizar a multiplicação do array com 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