Numpy中陣列的廣播機制總結

2021-10-11 21:34:22 字數 3210 閱讀 2169

numpy中的對於陣列間的算術運算採用「元素一 一對應」的計算機制,因而一般要求兩個陣列的形狀相同才能進行陣列間的算術運算,但是在某些情況中,numpy中允許符合一定規則的不同形狀的陣列進行算術運算。廣播的核心規則如下:

上面的規則可能看起來比較難懂,簡單來說就是低維陣列要想被拓展成和高維陣列一樣的形狀,從後往前比較時兩陣列時,低維陣列的所有維度要麼等於高維陣列的對應維度,要麼該維度大小值為1或缺失,陣列廣播將會在維度為1或缺失的維度方向上進行。舉例說明如下:

下面是一些廣播的例子:

舉例1:

in:

a = np.array([1,2,3,4])

b = 3

print(a*b)

out:

[ 3  6  9 12]

標量和陣列的乘積運算即是陣列廣播的最簡單的乙個例子,上訴過程中標量b被「虛擬」地擴充套件為陣列[3,3,3,3]然後才和陣列a[1,2,3,4]進行乘法運算,以滿足numpy中兩陣列間「元素一 一對應」的運算規則。

舉例2:

in:

a = np.array([[1,2,3,4],

[5,6,7,8],

[9,10,11,12],

[13,14,15,16]])

b = np.array([1,2,3,4])

print(a.shape)

print(b.shape)

print(a+b)

print((a+b).shape)

out:

a.shape:  (4, 4)

b.shape:  (4,)

運算結果為:

[[ 2  4  6  8]

[ 6  8 10 12]

[10 12 14 16]

[14 16 18 20]]

(a+b).shape:  (4, 4)

上訴一維陣列和二維陣列的加法運算中,b陣列其實和a陣列在第0維上的乙個內層元素形狀相同,因而b陣列可以被"虛擬"地拓展為乙個4x4的二維陣列,相當於被"縱向拉長了",然後再和a陣列進行加法運算。

a = np.ones((3,4,2))

b = np.ones((4,2))

print("a:\n",a)

print("b:\n",b)

print("a.shape: ",a.shape)

print('b.shape: ',b.shape)

print("a+b\n",a+b)

print("(a+b).shape: ",(a+b).shape)

out:

a:[[[1. 1.]

[1. 1.]

[1. 1.]

[1. 1.]]

[[1. 1.]

[1. 1.]

[1. 1.]

[1. 1.]]

[[1. 1.]

[1. 1.]

[1. 1.]

[1. 1.]]]

b:[[1. 1.]

[1. 1.]

[1. 1.]

[1. 1.]]

a.shape:  (3, 4, 2)

b.shape:  (4, 2)

a+b[[[2. 2.]

[2. 2.]

[2. 2.]

[2. 2.]]

[[2. 2.]

[2. 2.]

[2. 2.]

[2. 2.]]

[[2. 2.]

[2. 2.]

[2. 2.]

[2. 2.]]]

(a+b).shape:  (3, 4, 2)

上訴例子中,陣列b(4,2)實際上是陣列a(3,4,2)中的乙個第0維度上的乙個元素,滿足"兩陣列的後緣維度軸長度相同(滿足低維陣列和高維陣列的某一內層元素形狀相同,低維陣列才能被拓展成和高維陣列一樣的形狀)"規則,因而b陣列能被「虛擬」地拓展成為(3,4,2)的形狀,完成和陣列a的加法運算。

in:

a = np.ones((3,2,1,4,2))

b = np.ones((1,3,4,1))

print("a.shape: ",a.shape)

print('b.shape: ',b.shape)

print("(a+b).shape: ",(a+b).shape)

out:

a.shape:  (3, 2, 1, 4, 2)

b.shape:  (1, 3, 4, 1)

(a+b).shape:  (3, 2, 3, 4, 2)

上述例子中,從後往前依次比較a、b陣列的維度發現,要麼對應相等,要麼為1,滿足廣播的條件因而能進行算術運算。結果陣列的各維度取決於輸入陣列的各維度的最大值。

不滿足廣播規則的一些例子:

in:

a = np.ones((2,3,4))

b = np.ones((4,4))

print(a)

print(b)

print("a.shape: ",a.shape)

print('b.shape: ',b.shape)

print("(a+b).shape: ",(a+b).shape)

out:

[[[1. 1. 1. 1.]

[1. 1. 1. 1.]

[1. 1. 1. 1.]]

[[1. 1. 1. 1.]

[1. 1. 1. 1.]

[1. 1. 1. 1.]]]

[[1. 1. 1. 1.]

[1. 1. 1. 1.]

[1. 1. 1. 1.]

[1. 1. 1. 1.]]

a.shape:  (2, 3, 4)

b.shape:  (4, 4)

traceback (most recent call last):

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

上述例子中,b陣列的形狀為(4,4)不是a陣列的任意維度上的乙個元素,且從後往前比較時,對應維度大小不同且不等於1,因而不符合廣播規則,不能進行廣播後完成運算。

總結:numpy中陣列的廣播規則其實就是一句話,要麼低維陣列和高維陣列的某一內層元素形狀相同,要麼從後往前依次比較兩陣列的維度時,維度大小對應相等或為1。

Numpy陣列的廣播機制

numpy陣列不需要迴圈遍歷,即可對每個元素執行批量的算術運算操作 向量化運算 當兩個陣列大小 numpy.shape 不同時,進行算術運算會出現廣播機制。陣列在進行向量化運算的時,要求陣列形狀時相等的。當形狀不等的陣列執行算術運算的時候,就會出現廣播機制,該機制會對陣列進行擴充套件,使陣列的sha...

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...