NumPy - 广播
NumPy 广播
NumPy 中的广播功能是指能够对不同形状的数组执行运算,即自动扩展较小数组的形状以匹配较大数组的形状。这在执行算术运算或将函数应用于不同维度的数组时非常有用。
执行算术运算时,NumPy 会对数组的对应元素进行运算。如果数组形状相同,则运算可以顺利进行。但是,如果数组的形状不同,NumPy 会使用广播来对齐它们,从而轻松进行元素级操作。
广播规则
要使广播正常工作,必须满足以下规则 -
- 如果数组的维数不同,则在较小维数组的左侧用 1 填充,直到两个数组的长度相同。
- 每个维度的大小必须相同,或者其中一个必须为 1。
- 广播从最后一个维度应用到第一个维度。
例如,考虑两个形状分别为 (3, 4) 和 (4,) 的数组。广播规则将按如下方式对齐形状 -
填充较小数组的形状: 较小数组的形状 (4,) 填充为 (1, 4)。
对齐维度: 形状 (3, 4) 和 (1, 4) 分别对齐为 (3, 4) 和 (3, 4)。
执行元素级运算: 该运算应用于对齐的形状。
向数组添加标量
向数组添加标量时,NumPy 使用广播将标量应用于数组的每个元素。广播会扩展标量以匹配数组的形状,从而实现逐元素操作。
示例
在下面的示例中,我们将标量"10"广播到数组的每个元素,导致每个元素增加 10 -
import numpy as np # 创建数组 array = np.array([[1, 2, 3], [4, 5, 6]]) # 添加标量 result = array + 10 print(result)
以下是获得的输出 -
[[11 12 13][14 15 16]]
添加不同元素的数组形状
当添加不同形状的数组时,NumPy 会应用广播规则来确保它们的形状兼容。广播的工作原理是将较小的数组扩展到较大的数组上,这样两个数组在进行元素相加时具有相同的形状。
此过程消除了在执行操作之前手动重塑数组的需要。
示例 1
在此示例中,我们广播第二个数组"array2",使其与第一个数组"array1"的形状匹配 -
import numpy as np # 创建两个不同形状的数组 array1 = np.array([[1, 2, 3], [4, 5, 6]]) array2 = np.array([10, 20, 30]) # 使用广播添加数组 result = array1 + array2 print(result)
这将产生结果如下 -
[[11 22 33] [14 25 36]]
示例 2
以下是另一个在 NumPy 中广播两个不同形状数组的示例 -
import numpy as np a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) b = np.array([1.0,2.0,3.0]) print ('第一个数组:') print (a) print (' ') print ('第二个数组:') print (b) print (' ') print ('第一个数组 + 第二个数组') print (a + b)
该程序的输出如下 -
第一个数组: [[ 0. 0. 0.] [10. 10. 10.] [20. 20. 20.] [30. 30. 30.]] 第二个数组: [1. 2. 3.] 第一个数组 + 第二个数组 [[ 1. 2. 3.] [11. 12. 13.] [21. 22. 23.] [31. 32. 33.]]
下图演示了如何通过广播将数组 b 与 a 兼容。

多维数组的广播
在不同形状的多维数组之间执行运算时,广播规则会对齐它们的维度,以便可以逐元素地进行运算。
此过程涉及拉伸较小的数组以匹配较大数组的形状,从而使运算能够顺利执行。
示例
在下面的示例中,我们创建两个三维数组,然后使用广播将它们相加 -
import numpy as np # 创建两个三维数组 array1 = np.ones((2, 3, 4)) array2 = np.arange(4) # 使用广播添加数组 result = array1 + array2 print(result)
以下是上述代码的输出 -
[[[1. 2. 3. 4.] [1. 2. 3. 4.] [1. 2. 3. 4.]] [[1. 2. 3. 4.] [1. 2. 3. 4.] [1. 2. 3. 4.]]]
使用广播应用函数
广播不仅简化了不同形状数组之间的算术运算,还允许跨数组应用函数。这些函数包括:-
数学函数:执行数学运算的函数,例如加法、减法、乘法和除法。
统计函数:计算统计属性的函数,例如平均值、中位数、方差和标准差。
缩减函数:通过执行诸如求和、求积或求最大值之类的运算来缩减数组维度的函数。
逻辑运算:执行逻辑运算的函数,例如比较和逻辑运算(例如,与、或、非)。
当将函数应用于不同形状的数组时,广播可确保函数按元素应用。
示例
在此示例中,我们使用numpy.maximum() 函数用于对两个数组进行逐元素比较。该函数将"array1"中的每个元素与"array2"中的对应元素进行比较,结果是一个数组,其中每个元素都是输入数组中对应元素的最大值 -
import numpy as np # 创建数组 array1 = np.array([[1, 2, 3], [4, 5, 6]]) array2 = np.array([[10], [20]]) # 使用广播函数 result = np.maximum(array1, array2) print(result)
执行上述代码后,我们得到以下输出 -
[[10 10 10] [20 20 20]]