前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Numpy 修炼之道 (9)—— 广播机制

Numpy 修炼之道 (9)—— 广播机制

作者头像
abs_zero
修改2018-05-26 14:45:47
5620
修改2018-05-26 14:45:47
举报
文章被收录于专栏:AI派AI派

什么是广播

我们都知道,Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下。

可是大家又会发现,如果让一个数组加1的话,结果时整个数组的结果都会加1,这是什么情况呢?

代码语言:javascript
复制
>>> x = np.arange(3)
>>> x
array([0, 1, 2])
>>> x + 1
array([1, 2, 3])

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

numpy 广播示意图

小提示:图片不清的话可点击 阅读原文

广播示例

接下来我们通过实际代码验证下:

代码语言:javascript
复制
>>> a = np.arange(0, 40, 10)
>>> a.shape
(4L,)
>>> a
array([ 0, 10, 20, 30])
>>> b = np.array([0, 1, 2])
>>> b.shape
(3L,)
>>> b
array([0, 1, 2])
>>> a = a[:, np.newaxis] # 转换a的维度(形状)
>>> a.shape
(4L, 1L)
>>> a
array([[ 0],
       [10],
       [20],
       [30]])
>>> a + b
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

明显可以看出,相加前 a 的形状为 (4, 1), b 的形状为 (3, ), a+b 的结果的形状为(4, 3)。计算时,变换结果与上图类似,这里来详细介绍下:

代码语言:javascript
复制
>>> a
array([[ 0],
       [10],
       [20],
       [30]])
>>> a2 = np.array(([ i * 3 for i in a.tolist()])) # 会先将a转为a2
>>> a2
array([[ 0,  0,  0],
       [10, 10, 10],
       [20, 20, 20],
       [30, 30, 30]])
>>> b
array([0, 1, 2])
>>> b2 = np.array([b.tolist()] * 4) # 再将b转为b2
>>> b2
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])
>>> a2 + b2 # a2 + b2的结果就是 a + b 的结果
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

作者:无邪,个人博客:脑洞大开,专注于机器学习研究。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 脑洞科技栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是广播
  • 广播示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档