NumPy - 廣播



NumPy 廣播

NumPy 中的廣播是指透過自動擴充套件較小陣列的形狀以匹配較大陣列的形狀來對不同形狀的陣列執行運算的能力。這在執行算術運算或將函式應用於不同維度的陣列時非常有用。

在執行算術運算時,NumPy 對陣列的對應元素進行運算。如果陣列具有相同的形狀,則可以順利地執行運算。但是,如果陣列具有不同的形狀,則 NumPy 使用廣播來對齊它們,從而可以輕鬆地進行元素級運算。

廣播規則

為了使廣播起作用,必須滿足以下規則:

  • 如果陣列具有不同的維度數,則較小維度陣列的形狀將在左側填充 1,直到兩個形狀具有相同的長度。
  • 每個維度的尺寸必須相同,或者其中一個必須為 1。
  • 廣播從最後一個維度應用到第一個維度。

例如,考慮兩個形狀為(3, 4)(4,)的陣列。廣播規則將如下對齊形狀:

  • 填充較小陣列的形狀:較小陣列的形狀 (4,) 被填充為 (1, 4)。

  • 對齊維度:形狀 (3, 4) 和 (1, 4) 分別對齊為 (3, 4) 和 (3, 4)。

  • 執行元素級運算:運算應用於對齊的形狀。

向陣列新增標量

當向陣列新增標量時,NumPy 使用廣播將標量應用於陣列的每個元素。廣播擴充套件標量以匹配陣列的形狀,從而實現元素級運算。

示例

在以下示例中,我們將標量“10”廣播到陣列的每個元素,導致每個元素增加 10:

import numpy as np

# Creating an array
array = np.array([[1, 2, 3], [4, 5, 6]])

# Adding a scalar
result = array + 10
print(result)

以下是獲得的輸出:

[[11 12 13][14 15 16]]

新增不同形狀的陣列

當新增不同形狀的陣列時,NumPy 應用廣播規則使它們的形狀相容。廣播透過將較小陣列擴充套件到較大陣列上起作用,以便兩個陣列具有相同的形狀以進行元素級加法。

此過程無需在執行運算之前手動重新整形陣列。

示例 1

在此示例中,我們將第二個陣列“array2”廣播以匹配第一個陣列“array1”的形狀:

import numpy as np

# Creating two arrays with different shapes
array1 = np.array([[1, 2, 3], [4, 5, 6]])     
array2 = np.array([10, 20, 30])              

# Adding arrays with broadcasting
result = array1 + array2
print(result)

這將產生以下結果:

[[11 22 33]
 [14 25 36]]

示例 2

以下是另一個在 NumPy 中廣播兩個不同形狀陣列的示例:

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 ('First array:') 
print (a) 
print ('\n') 
   
print ('Second array:')
print (b)
print ('\n')
   
print ('First Array + Second Array')
print (a + b)

此程式的輸出如下:

First array:
[[ 0.  0.  0.]
 [10. 10. 10.]
 [20. 20. 20.]
 [30. 30. 30.]]


Second array:
[1. 2. 3.]


First Array + Second Array
[[ 1.  2.  3.]
 [11. 12. 13.]
 [21. 22. 23.]
 [31. 32. 33.]]

下圖演示瞭如何廣播陣列b以使其與a相容。

array

使用多維陣列進行廣播

在對具有不同形狀的多維陣列執行運算時,廣播規則會對齊它們的維度,以便可以對它們進行元素級運算。

此過程涉及擴充套件較小陣列以匹配較大陣列的形狀,從而可以順利地執行運算。

示例

在以下示例中,我們建立了兩個 3D 陣列,然後使用廣播將它們相加:

import numpy as np

# Creating two 3D arrays
array1 = np.ones((2, 3, 4))                    
array2 = np.arange(4)                        

# Adding arrays with broadcasting
result = array1 + array2
print(result)

以下是上述程式碼的輸出:

[[[1. 2. 3. 4.]
  [1. 2. 3. 4.]
[1. 2. 3. 4.]]

 [[1. 2. 3. 4.]
  [1. 2. 3. 4.]
  [1. 2. 3. 4.]]]

使用廣播應用函式

廣播不僅簡化了不同形狀陣列之間的算術運算,還允許跨陣列應用函式。這些函式可以包括:

  • 數學函式:執行數學運算的函式,例如加法、減法、乘法和除法。

  • 統計函式:計算統計屬性的函式,如平均值、中位數、方差和標準差。

  • 歸約函式:透過執行求和、乘積或最大值等運算來減少陣列維度的函式。

  • 邏輯運算:執行邏輯運算的函式,例如比較和邏輯運算(例如,AND、OR、NOT)。

在將函式應用於不同形狀的陣列時,廣播確保函式按元素進行應用。

示例

在此示例中,我們使用 numpy.maximum() 函式對兩個陣列執行元素級比較。該函式將“array1”的每個元素與“array2”的對應元素進行比較,結果是一個數組,其中每個元素是輸入陣列中對應元素的最大值:

import numpy as np

# Creating arrays
array1 = np.array([[1, 2, 3], [4, 5, 6]])   
array2 = np.array([[10], [20]])              

# Applying a function with broadcasting
result = np.maximum(array1, array2)
print(result)

執行上述程式碼後,我們將獲得以下輸出:

[[10 10 10]
 [20 20 20]]
廣告