Numpy 系列(八)- 廣播機制

 什麼是廣播

咱們都知道,Numpy中的基本運算(加、減、乘、除、求餘等等)都是元素級別的,可是這僅僅侷限於兩個數組的形狀相同的狀況下。python

但是你們又會發現,若是讓一個數組加1的話,結果時整個數組的結果都會加1,這是什麼狀況呢?數組

x = np.arange(3)
x
Out[225]: array([0, 1, 2])
x + 1
Out[226]: array([1, 2, 3])

其實這就是廣播機制:Numpy 能夠轉換這些形狀不一樣的數組,使它們都具備相同的大小,而後再對它們進行運算。給出廣播示意圖:spa

    廣播示例

接下來咱們經過實際代碼驗證下:blog

a = np.arange(0, 40, 10)
a.shape
Out[228]: (4,)
a
Out[229]: array([ 0, 10, 20, 30])
b = np.array([0,1,2])
b.shape
Out[231]: (3,)
b
Out[232]: array([0, 1, 2])
a = a[:, np.newaxis] # 轉換a的維度(形狀)
a.shape
Out[234]: (4, 1)
a
Out[235]: 
array([[ 0],
       [10],
       [20],
       [30]])
a + b
Out[236]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

 明顯能夠看出,相加前 a 的形狀爲 (4, 1), b 的形狀爲 (3, ), a+b 的結果的形狀爲(4, 3)。計算時,變換結果與上圖相似,這裏來詳細介紹下:class

a
Out[237]: 
array([[ 0],
       [10],
       [20],
       [30]])
a2 = np.array(([i * 3 for i in a.tolist()]))  # 會先將a轉化爲a2
a2
Out[239]: 
array([[ 0,  0,  0],
       [10, 10, 10],
       [20, 20, 20],
       [30, 30, 30]])
b
Out[240]: array([0, 1, 2])
b2 = np.array([b.tolist()] * 4) # 再將b轉爲b2
b2
Out[242]: 
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])
a2 + b2
Out[243]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])
相關文章
相關標籤/搜索