NumPy廣播


NumPy - 廣播

術語廣播是指 NumPy 在算術運算期間處理不同形狀的陣列的能力。 對陣列的算術運算通常在相應的元素上進行。 如果兩個陣列具有完全相同的形狀,則這些操作被無縫執行。

範例 1

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]

如果兩個陣列的維數不相同,則元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以對形狀不相似的陣列進行操作,因為它擁有廣播功能。 較小的陣列會廣播到較大陣列的大小,以便使它們的形狀可相容。

如果滿足以下規則,可以進行廣播:

  • ndim較小的陣列會在前面追加一個長度為 1 的維度。

  • 輸出陣列的每個維度的大小是輸入陣列該維度大小的最大值。

  • 如果輸入在每個維度中的大小與輸出大小匹配,或其值正好為 1,則在計算中可它。

  • 如果輸入的某個維度大小為 1,則該維度中的第一個資料元素將用於該維度的所有計算。

如果上述規則產生有效結果,並且滿足以下條件之一,那麼陣列被稱為可廣播的

  • 陣列擁有相同形狀。

  • 陣列擁有相同的維數,每個維度擁有相同長度,或者長度為 1。

  • 陣列擁有極少的維度,可以在其前面追加長度為 1 的維度,使上述條件成立。

下面的例稱展示了廣播的範例。

範例 2

import numpy as np 
a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]]) 
b = np.array([1.0,2.0,3.0])  
print  '第一個陣列:'  
print a 
print  '\n'  
print  '第二個陣列:'  
print b 
print  '\n'  
print  '第一個陣列加第二個陣列:'  
print a + b

輸出如下:

第一個陣列:
[[ 0. 0. 0.]
 [ 10. 10. 10.]
 [ 20. 20. 20.]
 [ 30. 30. 30.]]

第二個陣列:
[ 1. 2. 3.]

第一個陣列加第二個陣列:
[[ 1. 2. 3.]
 [ 11. 12. 13.]
 [ 21. 22. 23.]
 [ 31. 32. 33.]]

下面的圖片展示了陣列b如何通過廣播來與陣列a相容。

NumPy廣播