前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[开发技巧]·Numpy广播机制的深入理解与应用

[开发技巧]·Numpy广播机制的深入理解与应用

作者头像
小宋是呢
发布2019-06-27 13:21:47
7350
发布2019-06-27 13:21:47
举报
文章被收录于专栏:深度应用

[开发技巧]·Numpy广播机制的深入理解与应用

1.问题描述

我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作。广播机制很方便,但是概念却也有些复杂,可能会让一些初学者感到困惑,在使用过程中,产生一些错误。

本文以实战演练的方式来讲解广播机制的概念与应用,不仅仅适用于Numpy,在TensorFlow,PyTorch,MxNet的广播机制中同样适用。

2.原理讲解

广播机制遵循一下准则:

1.首先以最长纬度为准拓展为相同纬度大小,有些纬度为零,先变为1,在进行广播。

2.纬度上从右往左进行匹配,两个数组要么在一个纬度上相同,要么其中一个为1。

3.各个相匹配纬度上的数据都以此最长的shape为准进行复制对齐。

3.实战演练

代码语言:javascript
复制
>>> import numpy as np
>>> num1 = np.array(3)
>>> num1.shape
()
>>> al = np.ones([1,3])
>>> bl = np.ones([4,1])*2
>>> al
array([[1., 1., 1.]])
>>> bl
array([[2.],
       [2.],
       [2.],
       [2.]])

我们新建了一些数据,其中num1是一个标量,纬度为0,al与bl都是纬度为2的矩阵

现在我们让al+num1

代码语言:javascript
复制
>>> al_num1 = al+num1
>>> al_num1
array([[4., 4., 4.]])

根据矩阵加法的准则,两个矩阵的形状必须相同,对应元素相加,我们可以求得num1广播操作时,变成了array([[3., 3., 3.]])

其实就对应上面三个法则,首先这两个数据先进行条件1的操作,num1就变成了array([[3.]]),然后就满足了条件2,被条件3进行了广播。

再举一个例子,让al+bl,和上面例子类似,al与bl都被拓展为了shape(4,3),大家可以自己根据法则计算推理一遍。

代码语言:javascript
复制
>>> al_bl = al + bl
>>> al_bl
array([[3., 3., 3.],
       [3., 3., 3.],
       [3., 3., 3.],
       [3., 3., 3.]])

最后举一个不符合的例子

代码语言:javascript
复制
>>> cl = np.ones([2,2])*3
>>> cl
array([[3., 3.],
       [3., 3.]])
>>> al_cl = al + cl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (1,3) (2,2) 

为什么此次广播失败了呢,我们可以发现cl与al的最右边第一个纬度,大小既不相等,其中一个也不为1或者0(如果为0也会被拓展为1)。所以无法进行广播。

Hope this helps

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [开发技巧]·Numpy广播机制的深入理解与应用
    • 1.问题描述
      • 2.原理讲解
        • 3.实战演练
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档