Python NumPy 廣播(Broadcast)

VipSoft發表於2023-05-12

廣播(Broadcast)是 numpy 對不同形狀(shape)的陣列進行數值計算的方式, 對陣列的算術運算通常在相應的元素上進行。
如果兩個陣列 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 陣列對應位相乘。這要求維數相同,且各維度的長度相同。

import numpy as np

"""
如果兩個陣列 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 陣列對應位相乘。這要求維數相同,且各維度的長度相同。
"""
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 將自動觸發廣播機制。如:
"""
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([0, 1, 2])
print(a + b)
print('\n')
"""
4x3 的二維陣列與長為 3 的一維陣列相加,等效於把陣列 b 在二維上重複 4 次再運算:
"""
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([0, 1, 2])
bb = np.tile(b, (4, 1))  # 重複 b 的各個維度, 假設reps的維度為d,那麼新陣列的維度為max(d,A.ndim)
print(bb)
print(a + bb)

image

如果兩個 Tensor 的形狀的長度不一致,會在較小長度的形狀矩陣前部新增 1,直到兩個 Tensor 的形狀長度相等。
保證兩個 Tensor 形狀相等之後,每個維度上的結果維度就是當前維度上的較大值。

import numpy as np
 
"""
如果兩個 Tensor 的形狀的長度不一致,會在較小長度的形狀矩陣前部新增 1,直到兩個 Tensor 的形狀長度相等。
保證兩個 Tensor 形狀相等之後,每個維度上的結果維度就是當前維度上的較大值。
"""
x = np.ones([2, 1, 4])
y = np.ones((3, 1))
print('x => ', x)
print('y => ', y)
print('x+y => ', x + y)

image

廣播的規則:

  • 讓所有輸入陣列都向其中形狀最長的陣列看齊,形狀中不足的部分都透過在前面加 1 補齊。
  • 輸出陣列的形狀是輸入陣列形狀的各個維度上的最大值。
  • 如果輸入陣列的某個維度和輸出陣列的對應維度的長度相同或者其長度為 1 時,這個陣列能夠用來計算,否則出錯。
  • 當輸入陣列的某個維度的長度為 1 時,沿著此維度運算時都用此維度上的第一組值。

簡單理解:對兩個陣列,分別比較他們的每一個維度(若其中一個陣列沒有當前維度則忽略),滿足:

  • 陣列擁有相同形狀。
  • 當前維度的值相等。
  • 當前維度的值有一個是 1

相關文章