天天看點

NumPy 廣播(Broadcast)

廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對數組的算術運算通常在相應的元素上進行。

如果兩個數組 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 數組對應位相乘。這要求維數相同,且各次元的長度相同。

import numpy as np

a = np.array([1,2,3,4])

b = np.array([10,20,30,40])

c = a * b

print (c)

輸出結果為:

當運算中的 2 個數組的形狀不同時,numpy 将自動觸發廣播機制。如:

a = np.array([[ 0, 0, 0],

[10,10,10],

[20,20,20],

[30,30,30]])

b = np.array([1,2,3])

print(a + b)

下面的圖檔展示了數組 b 如何通過廣播來與數組 a 相容。

NumPy 廣播(Broadcast)

4x3 的二維數組與長為 3 的一維數組相加,等效于把數組 b 在二維上重複 4 次再運算:

bb = np.tile(b, (4, 1)) # 重複 b 的各個次元

print(a + bb)

廣播的規則:

讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加 1 補齊。

輸出數組的形狀是輸入數組形狀的各個次元上的最大值。

如果輸入數組的某個次元和輸出數組的對應次元的長度相同或者其長度為 1 時,這個數組能夠用來計算,否則出錯。

當輸入數組的某個次元的長度為 1 時,沿着此次元運算時都用此次元上的第一組值。

簡單了解:對兩個數組,分别比較他們的每一個次元(若其中一個數組沒有目前次元則忽略),滿足:

數組擁有相同形狀。

目前次元的值相等。

目前次元的值有一個是 1。

若條件不滿足,抛出 "ValueError: frames are not aligned" 異常。