介绍
NumPy 是 Python 中用于科学计算的强大库。NumPy 最重要的特性之一是其能够高效执行各种类型的数组乘法操作。
在本教程中,我们将探讨 NumPy 中可用的不同乘法操作,包括 numpy.multiply、numpy.dot、numpy.matmul、* 和 @ 运算符。
入门指南
在我们深入探讨 NumPy 中的不同乘法操作之前,首先让我们通过在终端中输入以下命令来打开 Python shell。
python3
然后导入库并创建一些示例数组,以便我们进行演示。
import numpy as np
## 创建示例数组
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
我们已经创建了两个数组 A 和 B,每个数组都有两行两列。现在,让我们来探索 NumPy 中可用的不同乘法操作。
numpy.multiply
numpy.multiply 函数用于对两个数组进行逐元素乘法运算。这两个数组必须具有相同的形状。结果数组将与输入数组具有相同的形状。
C = np.multiply(A, B)
print(C)
## Output:
## array([[ 5, 12],
## [21, 32]])
在这个例子中,A 中的每个元素与 B 中对应的元素相乘,从而实现了两个数组的逐元素乘法运算。
numpy.dot
numpy.dot 函数用于对两个数组执行矩阵乘法运算。第一个数组的列数必须与第二个数组的行数相同。结果数组的行数将与第一个数组相同,列数将与第二个数组相同。
C = np.dot(A, B)
print(C)
## Output:
## array([[19, 22],
## [43, 50]])
在这个例子中,我们对数组 A 和 B 执行了矩阵乘法运算。结果数组 C 有两行两列,符合预期。
numpy.matmul
numpy.matmul 函数也用于对两个数组执行矩阵乘法运算,但它在处理多维数组时有一些不同的规则。两个数组的形状必须相同,除了最后两个维度必须符合矩阵乘法的规则。如果任一数组是一维的,它会被通过在形状末尾添加一个 1 来提升为矩阵。
C = np.matmul(A, B)
print(C)
## Output:
## array([[19, 22],
## [43, 50]])
在这个例子中,我们得到的结果与 numpy.dot 相同。这是因为我们的数组 A 和 B 具有相同的形状,因此 numpy.matmul 的行为与 numpy.dot 相同。
以下是另一个不同的例子:
## 定义两个 3-D 数组
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
b = np.array([[[9, 10], [11, 12]], [[13, 14], [15, 16]]])
c = np.matmul(a, b)
d = np.dot(a, b)
print(c)
## Output:
## array([[[ 31, 34],
## [ 71, 78]],
## [[155, 166],
## [211, 226]]])
print(d)
## Output:
## array([[[[ 31, 34],
## [ 43, 46]],
## [[ 71, 78],
## [ 99, 106]]],
## [[[111, 122],
## [155, 166]],
## [[151, 166],
## [211, 226]]]])
在这个例子中,numpy.matmul 执行的是批量矩阵乘法操作。
由于 a 和 b 都是 3-D 数组,numpy.dot 的输出将具有维度 $(2,2,2,2)$。前两个维度对应于 a 和 b 中的两批 $2\times2$ 矩阵。接下来的两个维度对应于每对 $2\times2$ 矩阵的点积:
## 第一个 2 × 2 结果
dot(a[0], b[0]) =
dot([[1, 2],
[3, 4]],
[[9, 10],
[11, 12]]
= [[1*9 + 2*11, 1*10 + 2*12],
[3*9 + 4*11, 3*10 + 4*12]]
= [[31, 34],
[43, 46]]
* 运算符
* 运算符也用于对两个数组执行逐元素乘法运算,但其行为与 numpy.multiply 略有不同。如果两个数组具有相同的形状,* 运算符将执行逐元素乘法,就像 numpy.multiply 一样。然而,如果其中一个数组是标量值,* 运算符将对另一个数组的每个元素执行标量乘法。
C = A * B
D = A * 2
print(C)
## Output:
#array([[ 5, 12],
## [21, 32]])
print(D)
## Output:
## array([[2, 4],
## [6, 8]])
在第一个例子中,我们得到的结果与 numpy.multiply 相同。在第二个例子中,我们对数组 A 的每个元素执行了标量乘法。
@ 运算符
@ 运算符用于执行矩阵乘法,类似于 numpy.dot 和 numpy.matmul。它在 Python 3.5 中引入,作为 numpy.matmul 的简写形式。
C = A @ B
print(C)
## Output:
## array([[19, 22],
## [43, 50]])
在这个例子中,我们使用 @ 运算符对数组 A 和 B 执行矩阵乘法运算。结果数组 C 有两行两列,与 numpy.dot 和 numpy.matmul 的结果一致。
总结
在本教程中,我们探讨了 NumPy 中提供的不同乘法运算。每种运算都有其自己的规则和适用场景,因此为你的具体任务选择合适的运算非常重要。通过掌握这些运算,你可以使用 NumPy 在 Python 中高效地执行数组和矩阵乘法。



