您的位置:首页 > 编程语言 > Python开发

让你彻底搞懂轴和广播机制

2019-05-30 21:47 92 查看

这篇文章的目的就是让你彻底搞懂轴和广播!

先说轴!

轴是什么?轴就是维度!有几个轴就是有几个维度!第几个轴就是第几个维度!

轴的概念要清楚!数值是0维的,没有轴;数组是1维的,有1个轴,为0轴(即行);矩阵是2维的,有2个轴,为0轴(即行)和1轴(即列);张量是3维的,有3个轴,为0轴(即通道数)、1轴(即高)和2轴(即宽)。

注意注意注意!张量的0轴是通道数!你写一个张量,然后取它的shape,得到的第一个元素是通道数!

好的,轴懂了,下面说广播!

广播在numpy和tensorflow里都有!但是内容和原理是一样的!所以学一个就行了!那我们就说numpy的!

用书中的话来介绍广播的规则:两个数组之间广播的规则:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相等或其中一方的长度为1,则认为他们是广播兼容的,广播会在缺失和(或)长度为1的维度上进行。

是不是听不懂!是不是想骂街!怎么就非得说的这么官方!说明白点会死是吗!

那我就告诉你,这句话到底是啥!

首先告诉你啥是广播!

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

看见没!算术运算在相应的元素上进行!这是重点!无论加减乘除,都是对应元素进行!所以在广播里哪怕是矩阵相乘,也是对应元素相乘!

如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。如:

                                           

明明是两个尺寸不同的数组,怎么就能加上了呢!这就是广播!

第一个图,我们看到a是矩阵,二维的,shape是(4,3);而b是向量,一维的,shape是(3)。可以看到最后一个维度,就是最后一个轴是相等的,都是3!这就是上面说的【两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相等】!于是广播便把这个shape=(3)的数组扩展成shape=(4,3)的数组!这就是上面说的【广播会在缺失的维度上进行】!缺失哪了?缺失了那个4啊!因为一个是二维的一个是一维的,一维的那个相比于二维的那个缺少了0轴啊!所以就在缺失的这个0轴上扩展,这才扩展成了(4,3)啊!

第二个图,我们看到a是矩阵,二维的,shape是(4,3);而b是向量,一维的,shape是(1)。可以看到b的维度是1!满足【两个数组的后缘维度(即从末尾开始算起的维度)的其中一方的长度为1】!于是广播便把这个shape=(1)的数组扩展成shape=(4,3)的数组!这就是上面说的【广播会在长度为1的维度上进行】!

第三个图,我们看到a是矩阵,二维的,shape是(4,1);而b是向量,一维的,shape是(2)。可以看到a的最后一个维度是1!满足【两个数组的后缘维度(即从末尾开始算起的维度)的其中一方的长度为1】!于是广播便把这个shape=(4,1)的数组扩展成shape=(4,2)的数组!这就是上面说的【广播会在长度为1的维度上进行】!然后就形成了第一个图的样子!再像第一个图那样操作一遍就行了!当然这个操作不用你管,只要触发了广播,他就会负责到底帮你解决这个问题!

怎么扩展?直接复制!看这个图:

咔咔咔把b的1行扩展成了4行,这样就能加了吧!懂了吧!广播就是这样!

这是竖着扩展!举一反三!横着扩展也可以吧!

还有一点,你要注意,就是下图的情况!

怎么明明满足【两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相等或其中一方的长度为1】却不能扩展呢!没有为什么!因为这样的没法扩展,你扩展个试试?所以你可以把这个条件理解为:要么这俩数组尺寸都相等,要么这俩数组有一个数组少一个维度且这俩数组最后一个轴的值相等,要么这俩数组有一个少一个维度且这俩数组有一个数组的某个维度的值为1,要么这俩数组……反正只要能像上面那样,按列扩展成一致的shape,或者按行扩展成一致的shape,或者两者结合扩展成一致的shape的,就可以广播!

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NumPy