广播 Numpy 数组以进行算术运算
介绍
在理解广播是什么以及它是如何工作的之前,让我们先了解如何对 Numpy 数组执行算术运算。任何两个数组之间的算术运算总是逐个元素执行的。也就是说,如果你添加两个数组A和B ,则A的每个第 i 个元素都会添加到B的第 i 个元素以生成数组C。
如果两个数组的形状相同,则一切都会正常进行。如果数组的形状不同,则无法进行逐个元素的操作。但是在实际应用中,您很少会遇到形状相同的数组。因此,Numpy 还提供了对具有不同形状的数组进行算术运算的能力。这种能力称为广播。
广播规则
虽然你可以对具有广泛形状的数组进行算术运算,但仍存在一些限制。因此,在查看一些示例之前,了解广播规则会有所帮助。通常,如果满足以下条件,则可以在两个不同形状的数组之间进行算术运算:
- 每个维度的大小相同,或者
- 其中一个维度的大小为 1
甚至可以使用这些规则在十维数组和二维数组之间执行运算。数组的维数无关紧要。
让我们看一个例子来了解它是如何工作的。例如,我有两个数组,A和B,如下所示:
A = np.arange(12).reshape(3,4)
B = np.arange(4)
A
输出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
B
输出:
array([0, 1, 2, 3])
以及它们的形状:
A.shape
B.shape
输出:
(3, 4)
(4,)
请注意,数组A是二维数组,数组B是一维数组或标量值。当你添加这两个数组时,Numpy 会将较小的数组广播到较大的数组,操作成功。
广播的工作原理
广播从尾随维度开始进行比较,然后向前导维度移动。
在上例中,尾随维度的大小匹配,因此它继续检查下一个维度。由于数组B是一维数组,因此它没有前导维度。因此 Numpy 会自动将值 '1' 广播到数组B中缺失的维度。因此,在数组广播之后:
从图中可以看出,广播规则是令人满意的,并且 Numpy 允许两个数组之间进行算术运算。因此,如果添加它们:
A+B
输出:
array([[ 0, 2, 4, 6],
[ 4, 6, 8, 10],
[ 8, 10, 12, 14]])
使用二维数组进行广播
我们将B创建为二维数组,而不是标量值。
B = np.arange(3).reshape(3,1)
B.shape
输出:
(3, 1)
如果你打印B:
B
输出:
array([[0],
[1],
[2]])
数组A和B 的形状分别为 (3,4) 和 (3,1)。广播规则满足两个数组中的每个维度,因此可以进行算术运算。
A+B
输出:
array([[ 0, 1, 2, 3],
[ 5, 6, 7, 8],
[10, 11, 12, 13]])
使用三维阵列进行广播
我有一个三维Numpy数组A:
A = np.arange(24).reshape(2,3,4)
A
输出:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
A.shape
输出:
(2,3,4)
一维数组B
B = np.arange(4)
B
输出:
array([0, 1, 2, 3])
B.shape
输出:
(4,)
这里再次进行算术运算,因为 Numpy 将较小的数组B广播到较大的数组A 。因此,广播之后,数组A和B的形状分别变为 (2,3,4) 和 (1,1,4)。它们遵循广播条件,算术运算成功。
A+B
输出:
array([[[ 0, 2, 4, 6],
[ 4, 6, 8, 10],
[ 8, 10, 12, 14]],
[[12, 14, 16, 18],
[16, 18, 20, 22],
[20, 22, 24, 26]]])
使用两个三维数组进行广播
我有两个三维数组,A和B。数组A与之前的形状相同,形状为 (2,3,4)。数组B定义为:
B = np.arange(8).reshape(2,1,4)
并且具有以下形状:
B.shape
输出:
(2,1,4)
并且具有以下值:
输出:
array([[[0, 1, 2, 3]],
[[4, 5, 6, 7]]])
要确定这两个数组是否可以进行算术运算,只需重新查看规则。前导维度和尾随维度匹配。并且,对于另一个维度,其中一个维度为 1。因此可以进行算术运算。
A+B
输出:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~