廣播
NumPy 裡有個處理陣列的特別方法:廣播,意思是將「比較小的陣列內容,廣播到比較大的陣列中」,產生互相兼容的尺寸形狀,NumPy 的廣播實際使用 C 語言運作,可以有效的運用記憶體和運算,進一步提高程式運作的效率,這篇教學將會介紹 NumPy 廣播的用法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
廣播單一數字
如果是單一個數字,只要單純透過數學運算式,就能廣播為同樣大小的陣列,其運作的原理是將原本陣列的所有元素,根據數學運算式加減乘除廣播的數字,產生新的陣列。
import numpy as np
a = np.array([1,2,3,4]) # 1x4 陣列
b = 2 # 廣播單一數字 2
print(a+b) # [3 4 5 6]
print(a-b) # [-1 0 1 2]
print(a*b) # [2 4 6 8]
print(a%b) # [1 0 1 0]
c = np.array([[1,2,3],[4,5,6]]) # 2x3 陣列
print(c+b) # [[3 4 5] [6 7 8]]
print(c-b) # [[-1 0 1] [ 2 3 4]]
print(c*b) # [[ 2 4 6] [ 8 10 12]]
print(c%b) # [[1 0 1] [0 1 0]]
廣播陣列
如果要將某個陣列廣播到另外一個陣列,同樣能單純透過數學運算式進行計算後廣播,但必須注意在「同一個軸 ( 維度 )」上的數量必須相等或等於 1,不然廣播時會發生錯誤。
import numpy as np
a = np.array([[1,1,1],[2,2,2]]) # 2x3 陣列
b = np.array([1,2,3]) # 1x3 陣列
print(a+b) # [[2 3 4] [3 4 5]]
print(a-b) # [[ 0 -1 -2] [ 1 0 -1]]
print(a*b) # [[1 2 3] [2 4 6]]
print(a%b) # [[0 1 1] [0 0 2]]
c = np.array([[1,1,1],[2,2,2],[3,3,3]]) # 3x3 陣列
d = np.array([[1],[2],[3]]) # 3x1 陣列
print(c+d) # [[2 2 2] [4 4 4] [6 6 6]]
print(c-d) # [[0 0 0] [0 0 0] [0 0 0]]
print(c*d) # [[1 1 1] [4 4 4] [9 9 9]]
print(c%d) # [[0 0 0] [0 0 0] [0 0 0]]
如果是同樣尺寸的陣列,廣播就是將同位置的元素,互相進行數學計算,就能得到最終結果。
import numpy as np
a = np.array([[1,1,1],[2,2,2]]) # 2x3 陣列
b = np.array([[3,3,3],[4,4,4]]) # 2x3 陣列
print(a+b) # [[4 4 4] [6 6 6]]
print(a-b) # [[-2 -2 -2] [-2 -2 -2]]
print(a*b) # [[3 3 3] [8 8 8]]
print(a%b) # [[1 1 1] [2 2 2]]
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~