NumPy 廣播是一種強大的機制,允許 NumPy 在執行元素級運算時自動處理不同形狀的數組。廣播的規則使得無需顯式地創建匹配形狀的數組,直接進行運算,大大簡化了代碼并提高了效率。
基本概念
廣播的基本思想是讓較小的數組在需要的維度上進行擴展,以便與較大的數組進行兼容的形狀匹配。廣播的核心規則是:如果兩個數組的后緣維度(即從末尾開始算起的維度)大小相同,或其中一個大小為 1,則它們是廣播兼容的。
廣播規則
廣播機制遵循以下規則:
- 如果兩個數組的維度數不同,則將維度較小的數組的形狀前面補 1,直到兩個數組具有相同的維度數。
- 然后,從末尾維度開始,比較兩個數組的大小:
- 如果兩個維度大小相同,繼續比較下一個維度。
- 如果其中一個維度大小為 1,則擴展這個維度以匹配另一個維度。
- 如果兩個維度大小不同且都不為 1,則拋出錯誤。
示例
示例 1:相同維度
import numpy as npA = np.array([1, 2, 3])
B = np.array([4, 5, 6])# A 和 B 都是形狀為 (3,) 的一維數組
C = A + B
print(C) # 輸出: [5 7 9]
示例 2:不同維度
import numpy as npA = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([1, 2, 3])# A 的形狀為 (2, 3)
# B 的形狀為 (3,)
# B 被廣播為 [[1, 2, 3], [1, 2, 3]]
C = A + B
print(C) # 輸出: [[2 4 6]# [5 7 9]]
示例 3:擴展維度
import numpy as npA = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[1], [2]])# A 的形狀為 (2, 3)
# B 的形狀為 (2, 1)
# B 被廣播為 [[1, 1, 1], [2, 2, 2]]
C = A + B
print(C) # 輸出: [[2 3 4]# [6 7 8]]
廣播機制的實際應用
廣播機制在數據處理和科學計算中非常有用,可以簡化許多操作。下面是一些常見的應用場景:
標量和數組的運算
import numpy as npA = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[1], [2]])# A 的形狀為 (2, 3)
# B 的形狀為 (2, 1)
# B 被廣播為 [[1, 1, 1], [2, 2, 2]]
C = A + B
print(C) # 輸出: [[2 3 4]# [6 7 8]]
矩陣和向量的運算
import numpy as npA = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([1, 0, 1])# B 被廣播為 [[1, 0, 1], [1, 0, 1]]
C = A * B
print(C) # 輸出: [[1 0 3]# [4 0 6]]
總結
廣播機制使得 NumPy 可以在不同形狀的數組之間進行元素級運算,而無需顯式地創建匹配形狀的數組。理解和利用廣播可以大大簡化代碼,提高運算效率。
對于詳細的廣播規則和更多的示例,你可以參考 NumPy 的官方文檔:NumPy Broadcasting。