【Python】numpy广播机制
一,简介
当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。
二,规则
网上和书上都有对规则的描述,看到最多的有以下两种
第一种:
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
- 输出数组的形状是输入数组形状的各个维度上的最大值。
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
- 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
第二种:
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
第一种描述相对第二种就比较全面点,但是也不太好理解。结合两种描述后得到一个通俗的理解是:
1,无论两个数据维度是否相等,都将维度进行右对齐。
2,比较对应维度上的数值,存在这三种情况则进行广播,输出的维度大小取数值最大值
(1),数值相等
(2),存在一个为1
(3),存在一个为空
三,例子
import numpy as np
arr = np.arange(24).reshape(3, 4, 2)
arr2 = np.arange(8).reshape(4, 2)
arr3 = arr+arr2
print(arr3.shape) # (3, 4, 2)
"""
1,arr 与 arr2 右对齐
2,比较对应的数值,满足条件(1),(2)
arr 3 4 2
arr2 4 2
—————————————
arr3 3 4 2
"""
import numpy as np
arr = np.arange(24).reshape(3, 4, 2)
arr2 = np.arange(2).reshape(1, 1, 2)
arr3 = arr + arr2
print(arr3.shape) # (3, 4, 2)
"""
1,arr 与 arr2 右对齐
2,比较对应的数值,满足条件(1),(3)
arr 3 4 2
arr2 1 1 2
—————————————
arr3 3 4 2
"""
import numpy as np
arr = np.arange(24).reshape(3, 4, 2)
arr2 = np.arange(2).reshape(1, 2)
arr3 = arr + arr2
print(arr3.shape) # (3, 4, 2)
"""
1,arr 与 arr2 右对齐
2,比较对应的数值,满足条件(1),(2),(3)
arr 3 4 2
arr2 1 2
—————————————
arr3 3 4 2
"""
import numpy as np
arr = np.arange(24).reshape(3, 4, 2)
arr2 = np.arange(2).reshape(2)
arr3 = arr + arr2
print(arr3.shape) # (3, 4, 2)
"""
1,arr 与 arr2 右对齐
2,比较对应的数值,满足条件(1),(3)
arr 3 4 2
arr2 2
—————————————
arr3 3 4 2
"""
import numpy as np
arr = np.arange(24).reshape(3, 4, 2)
arr2 = np.arange(4).reshape(1, 4)
arr3 = arr + arr2
print(arr3.shape) # (3, 4, 2)
"""
1,arr 与 arr2 右对齐
2,比较对应的数值,不满足条件(1),报错
arr 3 4 2
arr2 1 4
—————————————
arr3
"""
参考:
https://finthon.com/numpy-broadcast/