NumPy dot 与 matmul 的区别

Manav Narula 2021年3月21日
NumPy dot 与 matmul 的区别

在 Python 中,数组被视为向量。二维数组也称为矩阵。我们提供了一些功能,可以在 Python 中执行它们之间的乘法运算。使用的两种方法是 numpy.dot() 函数和@运算符(数组的 __matmul__ 方法)。现在看来它们都执行相同的乘法功能。但是,两者之间存在一些差异,本教程对此进行了说明。

numpy.dot() 函数用于在 Python 中执行矩阵乘法。它还检查矩阵乘法的条件,即第一个矩阵的列数必须等于第二个矩阵的行数。它也适用于多维数组。我们还可以指定一个备用数组作为参数来存储结果。@乘法运算符调用用于执行相同乘法的数组的 matmul() 函数。例如,

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)

输出:

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

但是,当我们处理多维数组(N> 2 的 N-D 数组)时,结果略有不同。你可以在下面看到区别。

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)

输出:

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

matmul() 函数像矩阵的堆栈一样广播数组,它们分别作为位于最后两个索引中的元素。另一方面,numpy.dot() 函数将乘积作为第一个数组的最后一个轴与第二个数组的倒数第二个的乘积之和。

matmul()numpy.dot 函数之间的另一个区别是 matmul() 函数无法执行标量值与数组的乘法。

作者: 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