高效的 NumPy 数组乘法运算

NumPyBeginner
立即练习

介绍

NumPy 是 Python 中用于科学计算的强大库。NumPy 最重要的特性之一是其能够高效执行各种类型的数组乘法操作。

在本教程中,我们将探讨 NumPy 中可用的不同乘法操作,包括 numpy.multiplynumpy.dotnumpy.matmul*@ 运算符。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 97%。获得了学习者 100% 的好评率。

入门指南

在我们深入探讨 NumPy 中的不同乘法操作之前,首先让我们通过在终端中输入以下命令来打开 Python shell。

python3

然后导入库并创建一些示例数组,以便我们进行演示。

import numpy as np

## 创建示例数组
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

我们已经创建了两个数组 AB,每个数组都有两行两列。现在,让我们来探索 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]])

在这个例子中,我们对数组 AB 执行了矩阵乘法运算。结果数组 C 有两行两列,符合预期。

numpy.matmul

numpy.matmul 函数也用于对两个数组执行矩阵乘法运算,但它在处理多维数组时有一些不同的规则。两个数组的形状必须相同,除了最后两个维度必须符合矩阵乘法的规则。如果任一数组是一维的,它会被通过在形状末尾添加一个 1 来提升为矩阵。

C = np.matmul(A, B)

print(C)
## Output:
## array([[19, 22],
##        [43, 50]])

在这个例子中,我们得到的结果与 numpy.dot 相同。这是因为我们的数组 AB 具有相同的形状,因此 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 执行的是批量矩阵乘法操作。

由于 ab 都是 3-D 数组,numpy.dot 的输出将具有维度 $(2,2,2,2)$。前两个维度对应于 ab 中的两批 $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.dotnumpy.matmul。它在 Python 3.5 中引入,作为 numpy.matmul 的简写形式。

C = A @ B

print(C)
## Output:
## array([[19, 22],
##       [43, 50]])

在这个例子中,我们使用 @ 运算符对数组 AB 执行矩阵乘法运算。结果数组 C 有两行两列,与 numpy.dotnumpy.matmul 的结果一致。

总结

在本教程中,我们探讨了 NumPy 中提供的不同乘法运算。每种运算都有其自己的规则和适用场景,因此为你的具体任务选择合适的运算非常重要。通过掌握这些运算,你可以使用 NumPy 在 Python 中高效地执行数组和矩阵乘法。