Python 中 NumPy 的廣播

2021-09-28 19:57:25 字數 3396 閱讀 7476

廣播描述了 numpy 如何在算術運算期間處理具有不同形狀的陣列。為了實現形狀相容,較小的陣列仍在較大的陣列上「廣播」。廣播提供了一種向量化陣列操作的方法,以便在 c 而不是 python 中進行迴圈。

numpy 通常在逐個元素的基礎上對陣列對進行操作。在最簡單的情況下,兩個陣列必須具有完全相同的形狀,如:

>>> a = np.array([1.0, 2.0, 3.0])

>>> b = np.array([2.0, 2.0, 2.0])

>>> a * b

array([ 2., 4., 6.])

當陣列的形狀滿足某些約束時,numpy 的廣播規放寬了這種約束。當乙個陣列和乙個標量值在乙個操作中組合時,會發生最簡單的廣播示例:

>>> a = np.array([1.0, 2.0, 3.0])

>>> b = 2.0

>>> a * b

array([ 2., 4., 6.])

結果等同於前面的示例,b 是陣列。在算術運算期間,可以認為標量 b 被拉伸為和 a 具有相同形狀的陣列。新元素 b 只是原始標量的副本。實際過程中,numpy 使用原始標量值而不建立副本,因此廣播操作具有記憶體和計算效率。

在兩個陣列上執行時,numpy 會逐元素地比較它們的形狀。它從尾部尺寸開始,並逐漸往前。兩個尺寸相容時有:

1. 形狀相同

2. 其中乙個是1

如果不滿足這些條件,則丟擲 valueerror: operands could not be broadcast together 異常,指示陣列形狀不相容。結果陣列的大小是輸入陣列每一維度的最大值。

陣列不需要具有相同數量的維度。例如,如果您有乙個 256*256*3 的rgb值陣列,並且希望將影象中的每種顏色縮放不同的值,則可以將影象乘以具有 3 個值的一維陣列。根據廣播規則排列這些陣列的尾軸的大小,表明它們是相容的:

image  (3d array): 256 x 256 x 3

scale (1d array): 3

result (3d array): 256 x 256 x 3

當比較的任何乙個尺寸為 1 時,使用另乙個尺寸。換句話說,尺寸為 1 的尺寸被拉伸或「複製」以匹配另乙個尺寸。

在以下示例中,a 和 b 陣列都具有長度為 1 的軸,在廣播操作期間會擴充套件為更大的大小:

a      (4d array):  8 x 1 x 6 x 1

b (3d array): 7 x 1 x 5

result (4d array): 8 x 7 x 6 x 5

以下是一些例子:

a      (2d array):  5 x 4

b (1d array): 1

result (2d array): 5 x 4

a (2d array): 5 x 4

b (1d array): 4

result (2d array): 5 x 4

a (3d array): 15 x 3 x 5

b (3d array): 15 x 1 x 5

result (3d array): 15 x 3 x 5

a (3d array): 15 x 3 x 5

b (2d array): 3 x 5

result (3d array): 15 x 3 x 5

a (3d array): 15 x 3 x 5

b (2d array): 3 x 1

result (3d array): 15 x 3 x 5

以下是不廣播的形狀示例:

a      (1d array):  3

b (1d array): 4 # trailing dimensions do not match

a (2d array): 2 x 1

b (3d array): 8 x 4 x 3 # second from last dimensions mismatched

例子:

>>> x = np.arange(4)

>>> xx = x.reshape(4,1)

>>> y = np.ones(5)

>>> z = np.ones((3,4))

>>> x.shape

(4,)

>>> y.shape

(5,)

>>> x + y

valueerror: operands could not be broadcast together with shapes (4,) (5,)

>>> xx.shape

(4, 1)

>>> y.shape

(5,)

>>> (xx + y).shape

(4, 5)

>>> xx + y

array([[ 1., 1., 1., 1., 1.],

[ 2., 2., 2., 2., 2.],

[ 3., 3., 3., 3., 3.],

[ 4., 4., 4., 4., 4.]])

>>> x.shape

(4,)

>>> z.shape

(3, 4)

>>> (x + z).shape

(3, 4)

>>> x + z

array([[ 1., 2., 3., 4.],

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

[ 1., 2., 3., 4.]])

廣播提供了一種便捷的方式來獲取兩個陣列的外積(或任何其他外部操作)。以下示例顯示了兩個 1-d 陣列的外積操作:

>>> a = np.array([0.0, 10.0, 20.0, 30.0])

>>> b = np.array([1.0, 2.0, 3.0])

>>> a[:, np.newaxis] + b

array([[ 1., 2., 3.],

[ 11., 12., 13.],

[ 21., 22., 23.],

[ 31., 32., 33.]])

上邊 newaxis 索引操作符插入乙個新軸 a,使其成為乙個二維 4*1 陣列。將 4*1 陣列與形狀為 (3,) 的 b 組合,產生乙個 4*3 陣列。

numpy中的廣播機制

numpy兩個陣列的相加 相減以及相乘都是對應元素之間的操作。import numpy as np x np.array 2,2,3 1,2,3 y np.array 1,1,3 2,2,4 print x y numpy當中的陣列相乘是對應元素的乘積,與線性代數當中的矩陣相乘不一樣 輸入結果如下 ...

numpy中的廣播機制

結論 廣播原則 如果兩個陣列的後緣維度 即 從末尾開始算起的維度 的軸長相符或其中一方的長度為1,則認為它們是廣播相容的,廣播會在缺失和 或 長度為1的軸上進行.1.讓所有輸入陣列都向其中shape最長的陣列看齊,shape中不足的部分都通過在前面加1補齊 2.輸出陣列的shape是輸入陣列shap...

NumPy陣列廣播規則 python

numpy陣列遵循一組嚴格的規則,這組規則決定了兩個陣列之間的操作 1 如果兩個陣列的維度不同,小維度陣列將在最左邊補1 2 如果兩個陣列任何乙個維度都不匹配,陣列會擴充套件小的維度來和較大的那個陣列維度匹配 3 兩個陣列在任何乙個維度上都不匹配並且沒有任何乙個維度等於1,會引發異常 a np.ar...