“广播”指的是在不同维度的数组之间进行算术运算的一种执行机制,其通过将数据矢量化进行高效的运算,而不是按照传统的对标量数据进行循环运算达到目的,因此,“广播”是numpy一种中非常强大的功能,可以实现高效快速的矢量化数据的运算。下面,我们看看这个机制的原理是怎么样的,从而可以帮助我们更好的利用“广播”这个强大的功能。
首先,我们对“广播”进行一个大概的理解。顾名思义,“广播”具有扩散的特点,在数组里面,它的意思是,一个数组在另外一个数组中进行某种运算的扩散,那么如何扩散呢?“广播”的一个工作原则是:两个数组的维度应该相同(即要对一个二维数组进行广播,那么用来广播的数组也应该是二维的),并且只能有一个维度的长度允许不一样,且那个不一样的维度在用来广播的数组里面的长度应该为1(比如,对于一个(3,4)的二维数组,那么用来广播的数组必须是(3,1)或(1,4);比如对于一个三维的数组(3,4,5),用来广播的数组必须是(1,4,5)或(3,1,5)或(3,4,1)),这样子,我们才说两个数组是广播兼容的。广播会在沿着长度为1的那个维度进行扩散进行。(这里就知道,为什么我们需要一个长度为1的维度,其实就是广播进行扩散的维度)
说了那么多,下面我们分别用两个具体的二维和三维数据的例子来进行更好的说明。我们这两个例子的目的是对数据沿着特定的轴进行中心化。
首先是一个二维的例子,创建一个服从正态分布的随机数组成的大小为(3,4)的随机二维数组,然后对每行数据进行中心化。这里首先是求得每行的均值(即轴1),返回得到一个每行的均值数组,然后再让原二维数组的每一列减去对应的均值,通过均值数组的广播实现,这样就得到了每行中心化后的二维数组,并且我们再对其每行求均值可以发现均值都为0。这里在广播时,由于需要两个数组的维度一样,所以我们先要把均值数组转化成二维数组(这里用numpy的newaxis属性给均值数组添加一个新的长度为1 的维度),且轴1的长度为1,然后再沿着轴1进行广播。代码如图:
然后我们看一个三维的例子。同样先生成一个由标准正态随机数构成的(3,4,3)大小的三维数组,这里要注意的是,轴0对应的是3,即轴0上有3个(4,3)大小的二维数组,不要同一般数学里面的维度记法混淆。这里是沿着轴0对每个(3,4)的面板中心化,所以我们先要求得面板均值,用np.mean(0)方法,参数0代表沿着轴0求均值,这里会返回一个二维的均值数组,同样的,为了广播,我们需要把这里二维数组转化成三维的,利用numpy的newaxis属性增加一个长度为1的轴0维度,然后就会沿着轴0进行广播运算,最后我们得到的三维数组我们会发现其面板均值也都为0,说明确实中心化了。具体代码如图:
最后还有两点重要的说明:1、当用来广播的数组就是一维数组时,则默认沿着轴0广播;2、以上的例子只用到了减法运算,但是实际上还可以对+、*、/等其他运算同样的运用广播机制。
以上就是对numpy中“广播”机制原理的大致说明。广播是一个强大的功能,在对大数据的处理上,相对于循环处理,可以大大的提高运算速度,这是很重要的。而且利用广播机制编写代码也更简洁优雅,因此对于数据分析而言,掌握广播机制是绝对必要的。