NumPy - 数组乘法
NumPy 数组乘法
NumPy 数组乘法是指将两个数组逐个元素相乘的过程。在本文中,逐个元素乘法是指将一个数组中的每个元素与另一个数组中的对应元素相乘。
结果是一个新数组,其中每个元素代表输入数组中对应元素的乘积。
NumPy 中的逐个元素乘法
逐个元素乘法,也称为 Hadamard 积,是 NumPy 中的一种运算,将两个形状相同的数组相乘,并将该运算应用于每个对应的元素对。
要执行逐个元素乘法,两个数组必须具有相同的形状。如果数组形状不同,则应用广播规则使它们兼容。
示例
在下面的示例中,我们将数组 a 的每个元素与数组 b 的相应元素相乘 -
import numpy as np # 创建两个数组 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 执行逐元素乘法 result = a * b print(result)
以下是得到的输出 -
[ 4 10 18]
在NumPy
标量乘法是指将数组的每个元素乘以一个标量值。数组中的每个元素都与标量值相乘,从而生成一个新数组,其中所有元素都进行了相应的缩放。
结果数组的形状与原始数组相同,但每个元素都按标量进行了缩放。
示例
在此示例中,我们将标量"3"与数组"a"的每个元素相乘 -
import numpy as np # 创建数组 a = np.array([1, 2, 3]) # 与标量相乘 result = a * 3 print(result)
这将产生以下结果 -
[3 6 9]
乘法不同形状的 NumPy 数组
当对不同形状的数组进行乘法运算时,NumPy 使用广播来使这些形状兼容元素级运算。广播从最右侧对齐维度,根据特定规则调整形状,并平滑地执行操作。
示例
以下示例中,数组"b"被广播以匹配数组"a"的形状,然后执行元素乘法 -
import numpy as np # 创建不同形状的数组 a = np.array([[1, 2, 3], [4, 5, 6]]) b = np.array([10, 20, 30]) # 使用广播对数组进行乘法 result = a * b print(result)
以下是上述代码的输出 -
[[10 40 90] [40 100 180]]
NumPy 中的矩阵乘法
矩阵乘法是线性代数中的一种运算,其中两个矩阵按照特定规则相乘。在 NumPy 中,此运算使用 np.dot() 函数、@ 运算符或 np.matmul() 函数执行。
为了使矩阵乘法有效,第一个矩阵的列数必须等于第二个矩阵的行数。如果矩阵 A 的形状为 (m, n),矩阵 B 的形状为 (n, p),则结果矩阵的形状为 (m, p)。
示例:使用 numpy.dot() 函数
NumPy 中的 np.dot() 函数用于计算两个数组的点积。它处理二维数组的矩阵乘法和一维数组的点积 -
import numpy as np # 定义两个矩阵 matrix1 = np.array([[1, 2], [3, 4]]) matrix2 = np.array([[5, 6], [7, 8]]) # 使用 np.dot 执行矩阵乘法 result = np.dot(matrix1, matrix2) print(result)
输出结果如下所示 -
[[19 22] [43 50]]
示例:使用"@"运算符
NumPy 中的 @ 运算符为 np.dot() 函数提供了简写。它对二维数组执行矩阵乘法,并用于计算一维数组的点积 -
import numpy as np # 定义相同的矩阵 matrix1 = np.array([[1, 2], [3, 4]]) matrix2 = np.array([[5, 6], [7, 8]]) # 使用 @ 运算符执行矩阵乘法 result = matrix1 @ matrix2 print(result)
执行上述代码后,我们得到以下输出 -
[[19 22] [43 50]]
示例:使用 np.matmul() 函数
np.matmul() 函数可以处理二维以上的数组,方法是对输入数组的最后两个维度执行矩阵乘法,并根据需要广播任何前面的维度 -
import numpy as np # 定义一个三维数组和一个二维数组 array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) array_2d = np.array([[1, 0], [0, 1]]) # 使用 np.matmul 执行矩阵乘法 result = np.matmul(array_3d, array_2d) print(result)
结果如下 −
[[[1 2] [3 4]] [[5 6] [7 8]]]
逐元素乘法 vs. 矩阵乘法
区分逐元素乘法(使用 *)和矩阵乘法(使用 @ 或 np.dot())非常重要 -
逐元素乘法 - 第一个数组中的每个元素都与第二个数组中对应的元素相乘。
矩阵乘法 - 按照线性代数规则对行和列进行点积运算。
示例
在此示例中,我们重点介绍逐元素乘法和矩阵乘法之间的区别 -
import numpy as np # 创建两个二维数组 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 逐元素乘法 element_wise_result = a * b print("逐元素乘法: ", element_wise_result) # 矩阵乘法 matrix_result = np.dot(a, b) print("矩阵乘法: ", matrix_result)
我们得到如下所示的输出 -
逐元素乘法: [[ 5 12] [21 32]] 矩阵乘法: [[19 22] [43 50]]
不同数据类型的数组相乘
在 NumPy 中,当对不同数据类型的数组进行乘法时,类型强制转换规则用于确保操作可执行。此过程涉及在执行乘法之前将数组转换为通用数据类型。
NumPy 使用一组提升规则来确定结果的数据类型。一般规则是将操作数转换为可以保存结果且不损失精度的类型。遵循提升顺序 -
布尔值 → 整数 → 浮点数 → 复数。
例如,整数和浮点数会被提升为浮点类型,以容纳小数。
示例
在本例中,NumPy 将整数数组 b 提升为浮点类型,以匹配数组 a 的数据类型 -
import numpy as np # 创建具有不同数据类型的数组 a = np.array([1.5, 2.5, 3.5]) b = np.array([2, 3, 4], dtype=np.int32) # 执行乘法 result = a * b print(result)
以下是获得的输出 -
[3. 7.5 14.]
处理乘法中的维度不匹配
在 NumPy 中对数组执行乘法运算时,如果数组不共享兼容的形状,则可能会发生维度不匹配。 NumPy 通过广播解决了这个问题,并在这种情况下引发 ValueError。
示例
在以下示例中,形状"a"和"b"不兼容广播,导致错误 -
import numpy as np # 创建形状不兼容的数组 a = np.array([1, 2, 3]) b = np.array([[1, 2], [3, 4]]) # 尝试将不兼容的数组相乘 result = a * b print(result)
生成的结果如下 -
Traceback (most recent call last):File "/home/cg/root/66a1de2fae52f/main.py", line 8, in <module>result = a * bValueError: operands could not be broadcast together with shapes (3,) (2,2)