作者:黄伟呢

   

1. 本文介绍

前面我为大家讲述了Numpy数组的3类取数方式,大家也已经知道了如何从数组中取出自己想要的数据。

今天黄同学就为大家介绍一个重要的内容:广播机制

Numpy之所以强大,一方面是它有一个特殊的数据结构(ndarray数组)。另一方面,就是他的广播机制,对于满足条件的不同形状的数组,也能够自动进行矢量化运算。



python的mpi4py 广播 numpy 广播_python的mpi4py 广播

2. 什么是广播机制?

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

Numpy数组运算,要求输入的两个数组shape是一致的,当数组的shape不想等的时候,则会使触发广播机制,调整数组使得两个shape一致,满足规则,则可以运算,否则就出错。

再来看看,Numpy官网关于广播机制的一句原话。

In order to broadcast ,the size of the trailing axes for both arrays 
in an operation must either be the same size or one of them must be one.

"翻译如下"
   为了更够广播,进行操作的两个数组的尾部维度必须相同,或者其中一个数组的尾部维度是1。
 这个你可能会很蒙,毕竟是英译过来的,说不定还没有翻译到作者所写的那层意思,因此你简
 单了解一下这个就行。下面我们会对广播的使用做更为详细的总结!!!

文字终究是太抽象了,还是不懂呀????能不能举个栗子!



python的mpi4py 广播 numpy 广播_qml_02

3. 举个栗子

同种形状的数组,毋庸置疑,对应位置上的元素进行数值运算。对于不同形状的数组,有时候会触发广播机制。下面就带大家看几个例子。

我们先创建几个数组:

a = 2
print(a)

b = np.array([1,2])
print(b)

c = np.arange(1,7).reshape(3,2)
print(c)

d = np.arange(1,9).reshape(2,2,2)
print(d)

结果如下:



python的mpi4py 广播 numpy 广播_numpy_03

① 标量和一维、二维、三维数组之间的广播运算



python的mpi4py 广播 numpy 广播_cakephp_04

② 一维数组和二维数组之间的广播运算



python的mpi4py 广播 numpy 广播_统计学_05

③ 二维数组和三维数组元素之间的广播运算



python的mpi4py 广播 numpy 广播_统计学_06

可以看出:不同形状数组之间,有时候可以触发广播机制,有时候却又不能。那么,触发广播机制,需要什么条件呢?

4. 触发“广播机制”的条件

观察下面的表:



python的mpi4py 广播 numpy 广播_qml_07

记住下面两句话:

  • 对于一个标量,可以将这一个数字的形状看成是一行一列;
  • 对于一个一维数组,可以将它的形状看成是一行多列;

对上述表和上面两句话,了解后,仔细观察下图:



python的mpi4py 广播 numpy 广播_python的mpi4py 广播_08

不同形状的数组之间能不能触发广播机制,主要看对应形状的每一个位置上的数字,是否满足如下要求:

  • ① 要么对应位置上的数字完全一致,可以触发广播机制,比如说第Ⅵ组;
  • ② 对应位置上的数字要是不一样,那么对应位置上,必须有一个数字是1,比如说Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ;
  • ③ 如果对应位置上的数字不仅不相同,且没有任何一个的数字为1,那么就不能使用广播机制,比如说Ⅶ。