附录A 高阶Numpy
A.3 广播
广播描述了算法如何在不同形状的数组之间进行运算。它是一个强大的功能,但可能会导致混淆,即使对于有经验的用户也是如此。
1.最简单的广播示例发生在将标量值与数组组合的时候(见图A-1)
![](https://img.haomeiwen.com/i15259227/7908bc362e04a893.png)
注:有关此操作的说明,请参见图A-2。对行进行减均值的广播需要更小心。幸运的是,只要遵循规则,就可以在数组的任何维度上对潜在较低维度值进行广播(例如从二维数组的每一列中减去行均值)
![](https://img.haomeiwen.com/i15259227/d4ba9d9323f3fa14.jpg)
2.广播的规则
如果对于每个结尾维度(即从尾部开始的),轴长度都匹配或者长度都是1,两个二维数组就是可以兼容广播的。之后,广播会在丢失的或长度为1的轴上进行。
尽管我也是个经验丰富的NumPy用户,但我也不得不经常在思考广播机制时,停下来画一张图。考虑上一个例子,假设我们希望减去每一行的平均值。由于arr.mean(0)的长度为3,因此它与轴0上的广播兼容,因为arr中的结尾维度为3,因此匹配。
3.根据规则,为了从轴1减均值(即从每行减去行平均值),较小的数组的形状必须是(4, 1)(见图A-3)
![](https://img.haomeiwen.com/i15259227/cdfd103bf96b08d7.png)
图A-4阐明了该操作。
![](https://img.haomeiwen.com/i15259227/1083657ad3baf145.jpg)
图A-5是对沿着轴0将一个二维数组加到三维数组的示意
![](https://img.haomeiwen.com/i15259227/fe1bc2dbbd4a9074.jpg)
A.3.1 在其他轴上广播
使用更高维度的数组进行广播可能会更加令人头痛,但这确实是遵循规则的问题。如果你不这样做,你会得到这样的错误(见图A-7)
![](https://img.haomeiwen.com/i15259227/915c4f4b647c5bcf.png)
想要在轴0以外的轴上使用较低维数组进行算术运算是相当普遍的。根据广播规则,“广播维度”在较小的数组中必须为1。在这里显示的行减均值的例子中,这表示重新塑造行意味着形状是(4,1)而不是(4, )(见图A-8)
![](https://img.haomeiwen.com/i15259227/3ffb7c50646181fc.png)
在三维情况下,在三个维度中的任何一个维度上进行广播只是将数据重塑为形状兼容的问题。图A-9很好地显示了在三维数组的每个轴上广播所需的形状。
![](https://img.haomeiwen.com/i15259227/b7e7fa851fea8af1.jpg)
因此,一个常见的问题是需要添加一个长度为1的新轴,专门用于广播目的。使用reshape是一种选择,但插入一个轴需要构造一个表示新形状的元组。这通常是一个乏味的练习。因此,NumPy数组提供了一种通过索引插入新轴的特殊语法。我们使用特殊的np.newaxis属性和“完整”切片来插入新轴(见图A-10)
![](https://img.haomeiwen.com/i15259227/fdb732fb4b8f4dd0.png)
因此,如果我有一个三维数组并想在轴2上减去均值,也就是说我们需要这样写(见图A-11)
![](https://img.haomeiwen.com/i15259227/fb87e4f4911695fa.png)
你可能会想是否有一个在轴向上减均值但又不牺牲性能的方法。有的,但是它需要一些索引操作(见图A-12)
![](https://img.haomeiwen.com/i15259227/f193f70edad958fa.png)
A.3.2 通过广播设定数组的值
控制算术运算的相同广播规则也适用于通过数组索引设置值。在一个简单的例子中,我们可以做这样的事情(见图A-13)
![](https://img.haomeiwen.com/i15259227/71f81af5aa2b6a3e.png)
网友评论