NumPy 廣播(Broadcast)
廣播(Broadcast)是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對數組的算術運算通常在相應的元素上進行。
如果兩個數組 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 數組對應位相乘。這要求維數相同,且各維度的長度相同。
實例
# -*- coding: UTF-8 -*-
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print(c)
運行結果爲:
[ 10 40 90 160]
當運算中的 2 個數組的形狀不同時,numpy 將自動觸發廣播機制。如:
實例:
import numpy as np
a = np.array([[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
輸出結果爲:
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
下面的圖片展示了數組 b 如何通過廣播來與數組 a 兼容。
4x3 的二維數組與長爲 3 的一維數組相加,等效於把數組 b 在二維上重複 4 次再運算:
實例
import numpy as np
a = np.array([[0,0,0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
bb = np.tile(b,(4,1))
print(a + bb)
輸出結果爲:
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
廣播的規則:
- 讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加 1 補齊。
- 輸出數組的形狀是輸入數組形狀的各個維度上的最大值。
- 如果輸入數組的某個維度和輸出數組的對應維度的長度相同或者其長度爲 1 時,這個數組能夠用來計算,否則出錯。
- 當輸入數組的某個維度的長度爲 1 時,沿着此維度運算時都用此維度上的第一組值。
簡單理解: 對兩個數組,分別比較他們的每一個維度(若其中一個數組沒有當前維度則忽略),滿足:
- 數組擁有相同形狀。
- 當前維度的值相等。
- 當前維度的值有一個是 1。
若條件不滿足,拋出 “ValueError: frames are not aligned” 異常。