NumPy 广播

NumPy 广播

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同

当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制

import numpy as np 
 
a = np.array([[ 1, 2, 3],
              [10,10,10],
              [20,20,20],
              [30,30,30]])
b = np.array([1,2,3])
print(a + b)

# [[ 2  4  6]
#  [11 12 13]
#  [21 22 23]
#  [31 32 33]]

两个数组维度不相同进行计算时会进行广播机制,将两个数组维度列出向右对齐,从最后开始匹配,只有相等或者其中一个为1的情况下才会进行广播机制

如果两个数组的后缘维度(即:从末尾开始算起的维度)的轴长相符或其中一方的长度为1,则认为它们是广播兼容的,广播会在缺失和(或)长度为1的轴上进行

一维数组和二维数组之间的广播运算

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([0.0, 1.0, 2.0])
print(a.shape)#(4, 3)
print(b.shape)#(3,)
print(a+b)
#[[ 0.  1.  2.]
# [10. 11. 12.]
# [20. 21. 22.]
# [30. 31. 32.]]

NumPy广播

其实这就是广播机制:Numpy 可以转换这些形状不同的数组,使它们都具有相同的大小,然后再对它们进行运算。下面是广播示意图

广播示意图

术语广播是指 NumPy 在算术运算期间处理不同形状的数组的能力。对数组的算术运算通常在 相应的元素上进行。如果两个阵列具有完全相同的形状,则这些操作被无缝执行

如果两个数组的维数不相同,则元素到元素的操作是不可能的。然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。较小的数组会广播到较大数组的大小,以便使它们的形状可兼容

如果满足以下条件之一,那么数组被称为可广播的。

  • 数组拥有相同形状。数组拥有相同的维数,且某一个或多个维度长度为 1 。数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立

广播的规则:

规则 1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补 1。

规则 2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度 为 1 的维度扩展以匹配另外一个数组的形状。

规则 3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于 1, 那么会引发异常

原文地址:https://www.cnblogs.com/kai-/p/14828010.html