1. 程式人生 > >Numpy中的廣播原則/機制

Numpy中的廣播原則/機制

為了瞭解這個原則,首先我們來看一組例子:

# 陣列直接對一個數進行加減乘除,產生的結果是陣列中的每個元素都會加減乘除這個數。
In [12]: import numpy as np
In [13]: a = np.arange(1,13).reshape((4, 3))
In [14]: a * 2
Out[14]: array([[ 2, 4, 6],
                [ 8, 10, 12],
                [14, 16, 18],
                [20, 22, 24]])
# 接下來我們看一下陣列與陣列之間的計算
In [17]: b = np.arange(12,24).reshape((4,3))
In [18]: b
Out[18]: array([[12, 13, 14],
                [15, 16, 17],
                [18, 19, 20],
                [21, 22, 23]])
In [19]: a + b
Out[19]: array([[13, 15, 17],
                [19, 21, 23],
                [25, 27, 29],
                [31, 33, 35]])
In [20]: c = np.array([1,2,3])
In [21]: a+c
Out[21]: array([[ 2, 4, 6],
                [ 5, 7, 9],
                [ 8, 10, 12],
                [11, 13, 15]])
In [22]: d = np.arange(10,14).reshape((4,1))
In [23]: d
Out[23]: array([[10],
                [11],
                [12],
                [13]])
In [24]: a + d
Out[24]: array([[11, 12, 13],
                [15, 16, 17],
                [19, 20, 21],
                [23, 24, 25]])
# 從上面可以看出,和線性代數中不同的是,m*n列的m行的一維陣列或者n列的一維陣列也是可以計算的。

這是為什麼呢?這裡要提到numpy的廣播原則:

如果兩個陣列的後緣維度(從末尾開始算起的維度)軸長度相符其中一方的長度為1,則認為它們是廣播相容的。廣播會在缺失維度和(或)軸長度為1的維度上進行。

在上面的程式碼中,a的維度是(4,3),c的維度是(1,3);d的維度是(4,1)。所以假設有兩個陣列,第一個的維度是(x_1, y_1, z_1),另一個數組的維度是(x_2, y_2, z_2),要判斷這兩個陣列能不能進行計算,可以用如下方法來判斷:

if z_1 == z_2 or z_1 == 1 or z_2 == 1:
    if y_1 == y_2 or y_1 == 1 or y_2 == 1:
        if x_1 == x_2 or x_1 == 1 or x_2 == 1:
            可以運算
        else:
            不可以運算
    else:
        不可以運算
else:
    不可以運算

這裡需要注意:(3,3,2)和(3,2)是可以運算的,因為對於二維陣列(3,2)也可以表示為(1,3,2),套用上述的規則是完全適用的,同理:(4,2,5,4)和(2,1,4)也是可以進行運算的。