[开发技巧]·Numpy广播机制的深入理解与应用
2019-04-21 12:09
483 查看
[开发技巧]·Numpy广播机制的深入理解与应用
1.问题描述
我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作。广播机制很方便,但是概念却也有些复杂,可能会让一些初学者感到困惑,在使用过程中,产生一些错误。
本文以实战演练的方式来讲解广播机制的概念与应用,不仅仅适用于Numpy,在TensorFlow,PyTorch,MxNet的广播机制中同样适用。
2.原理讲解
广播机制遵循一下准则:
1.首先以最长纬度为准拓展为相同纬度大小,有些纬度为零,先变为1,在进行广播。
2.纬度上从右往左进行匹配,两个数组要么在一个纬度上相同,要么其中一个为1。
3.各个相匹配纬度上的数据都以此最长的shape为准进行复制对齐。
3.实战演练
>>> 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
>>> 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),大家可以自己根据法则计算推理一遍。
>>> al_bl = al + bl >>> al_bl array([[3., 3., 3.], [3., 3., 3.], [3., 3., 3.], [3., 3., 3.]])
最后举一个不符合的例子
>>> 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
相关文章推荐
- [开发技巧]·Numpy中对axis的理解与应用
- 深入理解java异常处理机制的原理和开发应用
- 安卓开发_深入理解广播机制
- jBPM 5/jBPM 6 基本概念,示例介绍,深入理解,工作流应用开发指南
- 从Android源码的角度理解应用开发(1)-Touch机制
- 深入理解使用白鹭引擎开发微信小游戏的构建机制
- jBPM 5/jBPM 6 基本概念,示例介绍,深入理解,工作流应用开发指南
- [开发技巧]·TensorFlow中numpy与tensor数据相互转化
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- [每天学点Android开发]Android广播事件机制及应用
- 安卓开发_深入理解Handler消息传递机制
- 深入理解移动开发的模板复用机制
- Android性能测试~从安卓开发机制(activity)层面理解应用性能
- 深入理解驱动开发中的机制与策略
- 深入理解Java Proxy机制 应用在 Hadoop RPC 框架
- 深入理解java异常处理机制及应用
- 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!
- 深入理解Struts 2.1及应用开发实例解析
- 安卓开发技巧一:深入理解Android布局中Layout_weight的属性
- 『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&_广播原理简介