目录
广播机制的规则
示例 1:标量与数组
示例 2:一维数组与二维数组
示例 3:不同形状数组的广播
示例 4:不兼容的数组广播
NumPy 的广播机制允许我们在不同形状的数组之间执行这些运算,而无需手动调整它们的尺寸。
广播机制遵循以下规则:
- 如果两个数组的维数不同,将较低维度的数组的形状前面补1,直到两个数组的维数相同。
- 如果两个数组在某个维度上的大小相同,或其中一个数组在该维度上的大小为1,则认为这两个数组在该维度上是兼容的。
- 如果两个数组在所有维度上都兼容,则可以广播。
- 广播之后,每个数组的行为就好像它的形状等于两个输入数组的形状的元素最大值。
- 在任何一个维度上,如果一个数组的大小是1,而另一个数组的大小大于1,那么首先复制前者,使其在该维度上的大小与后者相同。
如果两个数组在所有维度上都不兼容,则不能广播,尝试进行运算将引发错误。
广播允许我们将标量与数组相结合,就好像这个标量被扩展到了数组的每一个元素上一样。
import numpy as np
# 创建一个数组
arr = np.array([1, 2, 3])
print("Original array:", arr)
# 将标量广播到数组
broadcasted_scalar = arr + 5
print("Broadcasted scalar:", broadcasted_scalar)
输出:
Original array: [1 2 3]
Broadcasted scalar: [6 7 8]
当一维数组与二维数组进行运算时,一维数组似乎被沿着二维数组的第一个轴复制。
# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("2D array:\n", arr_2d)
# 一维数组广播到二维数组
broadcasted_arr = arr_2d + arr
print("Broadcasted 1D array to 2D array:\n", broadcasted_arr)
输出:
2D array:
[[1 2 3]
[4 5 6]]
Broadcasted 1D array to 2D array:
[[2 4 6]
[5 7 9]]
只要数组在某些维度上兼容,它们便可以广播。
# 创建一个一维数组
arr_1d = np.array([1, 2, 3, 4])
print("1D array:", arr_1d)
# 创建一个形状为 (1, 4) 的二维数组
arr_2d = np.array([[10]])
print("2D array:\n", arr_2d)
# 广播不同形状的数组
broadcasted_diff_shapes = arr_1d + arr_2d
print("Broadcasted different shapes:\n", broadcasted_diff_shapes)
预期输出:
1D array: [1 2 3 4]
2D array:
[[10]]
Broadcasted different shapes:
[[11 12 13 14]]
不满足广播条件的数组将无法进行运算。
# 创建两个维度不兼容的数组
arr_1 = np.array([[1, 2, 3], [4, 5, 6]])
arr_2 = np.array([[1, 2], [3, 4]])
try:
# 尝试广播不兼容的数组
arr_1 + arr_2
except ValueError as e:
print("Error:", e)
预期输出:
Error: operands could not be broadcast together with shapes (2,3) (2,2)