NumPy 之: 理解广播
简介
广播描述的是 NumPy 如何计算不同形状的数组之间的运算。如果是较大的矩阵和较小的矩阵进行运算的话,较小的矩阵就会被广播,从而保证运算的正确进行。
本文将会以具体的例子详细讲解 NumPy 中广播的使用。
基础广播
正常情况下,两个数组需要进行运算,那么每个数组的对象都需要有一个相对应的值进行计算才可以。比如下面的例子:
但是如果使用 Numpy 的广播特性,那么就不必须元素的个数准确对应。
比如,我们可以讲一个数组乘以常量:
下面的例子和上面的例子是等价的,Numpy 会自动将 b 进行扩展。
NumPy 足够聪明,可以使用原始标量值而无需实际制作副本,从而使广播操作尽可能地节省内存并提高计算效率。
第二个示例中的代码比第一个示例中的代码更有效,因为广播在乘法过程中移动的内存更少(b 是标量而不是数组)。
广播规则
如果两个数组操作,NumPy 会对两个数组的对象进行比较,从最后一个维度开始,如果两个数组的维度满足下面的两个条件,我们就认为这两个数组是兼容的,可以进行运算:
维度中的元素个数是相同的
其中一个维数是 1
如果上面的两个条件不满足的话,就会抛出异常: ValueError: operands could not be broadcast together。
维度中的元素个数是相同的,并不意味着要求两个数组具有相同的维度个数。
比如表示颜色的256x256x3
数组,可以和一个一维的 3 个元素的数组相乘:
相乘的时候,维度中元素个数是 1 的会被拉伸到和另外一个维度中的元素个数一致:
上面的例子中,第二维的 1 被拉伸到 7,第三维的 1 被拉伸到 6,第四维的 1 被拉伸到 5。
还有更多的例子:
下面是不匹配的例子:
再举个实际代码的例子:
广播还提供了一个非常方便的进行两个 1 维数组进行外部乘积的运算:
其中 a[:, np.newaxis] 将 1 维的数组转换成为 4 维的数组:
本文已收录于 http://www.flydean.com/07-python-numpy-broadcasting/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
版权声明: 本文为 InfoQ 作者【程序那些事】的原创文章。
原文链接:【http://xie.infoq.cn/article/b8d8a027c05ef7df2d55b053b】。文章转载请联系作者。
评论