在 NumPy 中,我们可以对不同形状的数组执行数学运算。形状较小的数组会扩展以匹配较大数组的形状。这就是所谓的广播。
让我们看一个例子。
array1 = [1, 2, 3]
array2 = [[1], [2], [3]]
array1 是一个一维数组,而 array2 是一个二维数组。让我们在这两个不同形状的数组之间执行加法运算。
result = array1 + array2
在这里,NumPy 会自动广播一维数组 array1 的大小,以执行与二维数组 array2 的逐元素加法。
示例:NumPy 广播
import numpy as np
# create 1-D array
array1 = np.array([1, 2, 3])
# create 2-D array
array2 = np.array([[1], [2], [3]])
# add arrays of different dimension
# size of array1 expands to match with array2
sum = array1 + array2
print(sum)
输出
[[2 3 4] [3 4 5] [4 5 6]]
在这个示例中,我们对两个不同维度的数组进行了相加。NumPy 会自动扩展一维数组 array1 的大小以匹配二维数组 array2 的大小。
然后,在两个二维数组之间执行逐元素加法。
广播的兼容性规则
广播仅适用于兼容的数组。NumPy 从右到左比较一组数组维度。
要进行广播,每一组维度都必须与数组兼容。一组维度长度兼容,当
- 其中一个长度为 1,或者
- 它们相等。
让我们看一个例子。
array1 = shape(6, 7)
array2 = shape(6, 1)
这里,array1 和 array2 是维度分别为 (6,7)
和 (6,1)
的数组。
维度长度 7 和 1 是兼容的,因为其中一个为 1。
同样,6 和 6 是兼容的,因为它们是相同的。
由于两组维度都兼容,因此这些数组是可广播的。
可广播形状的示例
现在,我们将列出可广播和不可广播的形状。
可广播形状
(6, 7)
和(6, 7)
(6, 7)
和(6, 1)
(6, 7)
和(7, )
两个数组不必具有相同的维度即可进行广播。
最后一组形状是可广播的,因为最右边的维度都是 7。
不可广播形状
(6, 7)
和(7, 6)
(6, 7)
和(6, )
最后一组形状不可广播,因为最右边的维度不相同。
与标量的广播
我们还可以对数组和标量(单个值)执行数学运算。例如,
import numpy as np
# 1-D array
array1 = np.array([1, 2, 3])
# scalar
number = 5
# add scalar and 1-D array
sum = array1 + number
print(sum)
输出
[6 7 8]
在此示例中,NumPy 会自动将标量 number 扩展为一维数组,然后执行逐元素加法。