NDArray广播机制的一种理解方式
前提
两个NDArray形状不同
理解
当形状不同时,则从后向前逐一比较第 i 维的宽度,当二者第 i 维宽度相等,或至少有一个宽度等于1时,则继续比较前面一个的维度,既i-1维,否则,两个矩阵则不能触发广播机制进行运算,当其中一个维度i已经变为0,则停止比较,并触发广播机制并进行运算。
伪码过程
首先已知NDArray A和B
当形状不同时
从二者维度的最后一个数字开始比较
当对应维度的宽度不相等且均不等于1时
退出循环,抛出异常表示二者不能触发广播机制
否则,当其中一个NDArray维度超出范围
则将超出范围的NDArray对应位置维度的宽度视为1,并继续向前比较
当二者都超出维度范围
则触发广播机制进行运算
返回运算结果
参考
https://blog.csdn.net/chaihan9876/article/details/100959586
问题
《动手学深度学习》(By Aston Zhang, Mu Li, Zachary C.Lipton, Alexander J.Smola)中介绍NDArray中的广播运算时并没有说清楚广播运算的条件。但是,此运算在此书后续代码中广泛使用,结合网络上的搜索,特别详解如下。
详解
情况一:两个形状相同的NDArray按元素运算,不需要广播机制。
情况二:当形状不同时,这两个NDArray按元素运算还有可能进行。
条件是:这两个NDArray的形状要“兼容”。所谓“兼容”是指:
为了确定两个形状是否是可兼容的,需要从最后开始往前逐个比较它们的维度(dimensions)大小。比较过程中,如果两者的对应维度相同,或者其中之一(或者全是)等于1,比较继续进行直到最前面的维度。否则,你将看到ValueError错误出现("operands could not be broadcast together with shapes ...")。
当其中之一的形状的维度超出范围(例如,a1 的shape=(2,3,4)而a2的shape=(3,4),当a1的2超出a2范围),此时Numpy将会使用1进行比较(如将a2.shape替换为(1,3,4))直到另一个也超出dim范围。
一旦Numpy确定两者的形状是可兼容的,最终结果的形状就成了每个维度上取两者之间最大的形状尺寸。

浙公网安备 33010602011771号