????????
目录
????????广播是 NumPy 在算术运算中处理不同形状数组的方式。它按照特定的规则自动扩展数组的维度,让它们具有兼容的形状,以便可以执行逐元素的操作。
NumPy 的广播遵循以下规则:
- 规则一:?如果两个数组在维度上不匹配,那么数组的形状会沿着长度为1的维度进行扩展以匹配另一个数组的形状。
- 规则二:?如果两个数组在任何维度上的大小不一致,并且其中一个数组在该维度上的大小为1,则这个数组看起来会被复制扩展到与另一个数组相同的大小。
- 规则三:?如果在所有维度上大小都不匹配,并且没有任何一个维度等于1,则会引发错误。
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3)
B = np.array([10, 20, 30]) # 形状 (3,)
# 这里 B 将按照广播规则自动扩展为:
# [[10, 20, 30],
# [10, 20, 30]]
# 现在 A 和 B 具有相同的形状,可以执行逐元素加法
C = A + B
print(C)
输出将是:
[[11 22 33]
[14 25 36]]
?考虑以下具有更高维度的数组和一个形状不匹配的向量:
A = np.random.rand(4, 3, 2) # 随机生成一个形状为 (4, 3, 2) 的数组
B = np.array([1, 2]) # 形状为 (2,)
# 此时 B 将沿着第二个维度 (size 1) 进行扩展以匹配 A 的形状
# 变为形状 (1, 1, 2),然后在其他维度进行复制以匹配 A:
# [[[1, 2]],
# [[1, 2]],
# [[1, 2]],
# [[1, 2]]]
# 现在 A 和 B 可以进行逐元素运算
C = A + B
????????在这个例子中,B
仅在最后一个维度上与 A
的形状不匹配。根据广播规则,B
首先被扩展为 (1, 1, 2)
,然后在前两个维度上复制以匹配 A
的形状 (4, 3, 2)
。
当广播规则不能应用于两个数组时,将引发错误:
A = np.ones((3, 2))
B = np.ones((2, 3))
# 尝试相加将引发错误,因为 A 和 B 在任何维度上都不匹配
# 并且没有任何一个维度等于1
C = A + B # ValueError: operands could not be broadcast together
????????在这个例子中,A
和 B
都没有任何一个维度大小为1,它们也不匹配,因此无法进行广播。