在Python中使用numpy进行数组运算时,会遇到形状相同和形状不同的情况

形状相同

形状相同的数组之间的运算就是在对应位做运算。

形状不同

在NumPy中如果遇到大小不一致的数组运算,就会触发广播机制。

广播

广播(broadcasting)指的是不同形状的数组之间的算术运算的执行方式。

广播原则img

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。

  • 输出数组的形状是输入数组形状的各个维度上的最大值。

  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错

  • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。


    通俗的理解就是:将两个数组的维度大小右对齐,然后比较对应维度上的数值,如果数值相等或其中有一个为1或者为空,则能进行广播运算,并且输出的维度大小为取数值大的数值。否则不能进行数组运算。


举例

数组a的大小为(4,3)
数组b的大小为(4,1)
右对齐:
    4,3
    4,1
--------
    4,3
所以最后两个数组运算的输出大小为:(4,3),二维数组在1维上进行传播。

img

数组a的大小为(4,3)
数组b的大小为(1,3)
右对齐:
    4,3
    1,3
--------
    4,3
所以最后两个数组运算的输出大小为:(4,3),二维数组在0维上进行传播。

数组a的大小为(3,4,2)
数组b的大小为(4,2)
右对齐:
    3,4,2
      4,2
----------
    3,4,2
所以最后两个数组运算的输出大小为:(4,3),三维数组在0维上进行传播。

img

两个数组右对齐以后,对应维度里的数值要么相等,要么为1,要么缺失取大值。除此之外就会报错