numpy中的广播机制

何为广播机制

numpy 中两个数组的相加、相减以及相乘都是对应元素之间的操作。
当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)。

要想理解广播机制,

  • 首先需要理解张量(tensor或称为多维数组)的0轴、1轴、2轴……,这些轴的顺序关系是:
  • 其次,广播机制通常在同级轴之间传递。这里的同级轴是从后缘维度trailing dimension,即从末尾开始算起的维度)的角度来看待的。如果其中一个tensor的最后一个轴长度等于1,则有可能存在在两个轴方向都广播扩展的情况。

需要说明的是:在广播扩展时,两个tensor首先要从后缘维度方向对齐

同时要注意:

  • 广播后运算结果的形状(shape)是两个tensor的形状的各个维度的最大值所组成的。
    如:shape为(5,1,1)和(1,17,1)的tensor相加,结果为(5,17,1)
  • 两个张量在运算时,可能存在两个tensor都需要广播的情况;也可能存在一个tensor在两个轴方向进行广播扩展的情况。
    如:shape为(5,1,1)和(5,17,17)的两个tensor相加,结果为(5,17,17),第一个tensor会在1轴、2轴方向进行扩展。

上面的四条内容是理解广播机制的灵魂。下面看看广播的原则:

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

广播主要发生在两种情况,

  • 一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符;
  • 另外一种是有一方的长度为1。

举例:

数组维度不同,后缘维度的轴长相符

import numpy as np

arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]])  #arr1.shape = (4,3)
arr2 = np.array([1, 2, 3])    #arr2.shape = (3,)
arr_sum = arr1 + arr2
print(arr_sum)

输入结果如下:
'''
[[1 2 3]
 [2 3 4]
[3 4 5]
[4 5 6]]
'''

上例中arr1的shape为(4,3),arr2的shape为(3,)。可以说前者是二维的,而后者是一维的。但是它们的后缘维度相等,arr1的第二维长度为3,和arr2的维度相同。arr1和arr2的shape并不一样,但是它们可以执行相加操作,这就是通过广播完成的,在这个例子当中是将arr2沿着0轴进行扩展。

上面程序当中的广播如下图所示:

同样的例子还有:

从上面的图可以看到,(3,4,2)和(4,2)的维度是不相同的,前者为3维,后者为2维。但是它们后缘维度的轴长相同,都为(4,2),所以可以沿着0轴进行广播。
同样,还有一些例子:(4,2,3)和(2,3)是兼容的;(4,2,3)还和(3)是兼容的,后者需要在两个轴上面进行扩展。

数组维度相同,其中有个轴长度为1

import numpy as np

arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]])  #arr1.shape = (4,3)
arr2 = np.array([[1],[2],[3],[4]])    #arr2.shape = (4, 1)

arr_sum = arr1 + arr2
print(arr_sum)

输出结果如下:
[[1 1 1]
 [3 3 3]
 [5 5 5]
 [7 7 7]]

arr1的shape为(4,3),arr2的shape为(4,1),它们都是二维的,但是第二个数组在1轴上的长度为1,所以,可以在1轴上面进行广播,如下图所示:

在这种情况下,两个数组的维度要保证相等,其中有一个轴的长度为1,这样就会沿着长度为1的轴进行扩展。
这样的例子还有:

  • (4,6)和(1,6)
  • (3,5,6)和(1,5,6)、(3,1,6)、(3,5,1),后面三个tensor分别会沿着0轴,1轴,2轴进行广播。
  • 还有上面两种结合的情况,如(3,5,6)和(1,6)是可以相加的,后一个tensor会在0轴和1轴方向进行扩展。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值