Numpy 数组广播规则
Numpy 是一个 Python 库,用于支持大规模多维数组和矩阵运算。它是 SciPy 核心库的基础,也是很多科学计算工具箱的基础。Numpy 数组广播规则是一种简单而强大的机制,可以使不同形状的数组进行算术运算,而无需创建临时数组。
在本文中,我们将介绍 Numpy 数组广播规则的基本知识,并且解释如何使用广播机制来执行数组之间的算术运算。
阅读更多:Numpy 教程
Numpy 数组广播规则
广播规则描述了 Numpy 如何对不同形状的数组进行算术运算。在规则的帮助下,Numpy 将执行以下操作来完成广播:
- 如果两个数组的维数不同,则向较少维度的数组添加一个”1″以匹配两个数组的形状;
- 如果两个数组在某个维度上的大小不同,但至少有一个数组的该维度大小为 1,则使用带有大小 1 的该维度的数组进行操作,以匹配另一个数组的形状;
- 如果两个数组在某个维度上的大小不同且都不为 1,则无法进行广播。对于不同形状的数组,通常需要通过重塑数组来进行匹配。
让我们看几个广播的例子:
import numpy as np
# 广播规则1
a = np.array([1, 2, 3])
b = 5
c = a + b
print(c) # 输出: [6, 7, 8]
# 广播规则2
d = np.array([[1, 2], [3, 4]])
e = np.array([10, 20])
f = d + e
print(f) # 输出: [[11, 22], [13, 24]]
# 广播规则3
g = np.array([4, 5, 6])
h = np.array([10, 20])
i = g + h
# 输出以下错误:ValueError: operands could not be broadcast together with shapes (3,) (2,)
在上面的示例中,广播规则 1 可以让标量值“5”转换为数组 [5, 5, 5],以便与数组 a 进行操作。这个操作将标量值“5”视为形状为 (1,) 的数组,并且重复它以匹配形状为 (3,) 的数组 a。
广播规则 2 是在一个二维数组 d 和一个一维数组 e 之间执行的。在规则的帮助下,Numpy 把 e 转换为二维形状为 (2, 1) 的数组 [[10], [20]],并重复它以匹配 d 的形状 (2, 2)。
广播规则 3 中的两个数组 g 和 h 在形状上不兼容,因此无法进行广播。在这种情况下,通常需要重塑(reshape)数组,以匹配它们的形状。
应用广播规则
广播规则可以使 Numpy 对数组之间进行逐元素的算术运算变得容易和直观。让我们看几个应用广播规则的场景。
例子 1:对每个元素进行同样的操作
当对每个元素执行同样的操作时,通常使用广播规则。例如,在以下代码中,我们将通过广播规则将数组 a 中的每个元素加上偏移量 0.5。
a = np.array([[1, 2], [3, 4], [5, 6]])
b = 0.5
c = a + b
print(c) # 输出: [[1.5, 2.5], [3.5,4.5], [5.5, 6.5]]
在上面的代码中,b 被视为形状为 (1,) 的数组,并且通过重复它来匹配 a 的形状 (3, 2)。
例子 2:对两个数组执行逐元素的操作
广播规则不仅能够执行标量和数组之间的操作,还能执行两个数组之间的逐元素操作。例如,在以下代码中,我们将使用广播规则对两个形状不同的数组执行逐元素的操作。
a = np.array([1, 2, 3])
b = np.array([[10], [20], [30]])
c = a + b
print(c) # 输出: [[11], [22], [33]]
在上面的代码中,b 被视为形状为 (3, 1) 的数组,并通过重复它来匹配 a 的形状 (3,)。然后,它们的形状变为 (3, 1) 和 (3,),Numpy 自动对第二个数组的形状进行广播,之后进行逐元素操作。
例子 3:对多个数组执行逐元素的操作
广播规则甚至可以执行多个数组之间的逐元素操作。例如,在以下代码中,我们将使用广播规则对三个形状不同的数组执行逐元素的操作。
a = np.array([1, 2, 3])
b = np.array([[10], [20], [30]])
c = np.array([0.5])
d = a + b + c
print(d) # 输出: [[11.5], [22.5], [33.5]]
在上面的代码中,c 被视为形状为 (1,) 的数组,并通过重复它来匹配 a 和 b 的形状 (3,) 和 (3, 1)。然后,它们的形状变为 (3, 1) 和 (3, 1) 和 (1,),Numpy 自动对第三个数组的形状进行广播,之后进行逐元素操作。
总结
Numpy 数组广播规则是一种简单而强大的机制,可以使不同形状的数组进行算术运算,而无需创建临时数组。广播规则分为三个步骤,从而决定哪些数组可以进行广播操作。使用广播规则可以使 Numpy 对数组之间进行逐元素的算术运算变得容易和直观。在实际应用中,广播规则经常用于同时处理多个数组的数据,例如深度学习中的神经网络运算。有了 Numpy 数组广播规则,我们可以更轻松地完成这些任务。