1. 程式人生 > >Numpy 修煉之道 (9)—— 廣播機制

Numpy 修煉之道 (9)—— 廣播機制

 

什麼是廣播

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

可是大家又會發現,如果讓一個數組加1的話,結果時整個陣列的結果都會加1,這是什麼情況呢?

>>> x = np.arange(3)
>>> x
array([0, 1, 2])
>>> x + 1
array([1, 2, 3])

其實這就是廣播機制:Numpy 可以轉換這些形狀不同的陣列,使它們都具有相同的大小,然後再對它們進行運算。給出廣播示意圖:

                   numpy 廣播示意圖
          小提示:圖片不清的話可點選 閱讀原文
廣播示例
接下來我們通過實際程式碼驗證下:
>>> a = np.arange(0, 40, 10)
>>> a.shape
(4L,)
>>> a
array([ 0, 10, 20, 30])
>>> b = np.array([0, 1, 2])
>>> b.shape
(3L,)
>>> b
array([0, 1, 2])
>>> a = a[:, np.newaxis] # 轉換a的維度(形狀)
>>> a.shape
(4L, 1L)
>>> a
array([[ 0],[10], [20], [30]])
>>> a + b
array([[ 0,  1,  2],
      [10, 11, 12],
      [20, 21, 22],
      [30, 31, 32]])
明顯可以看出,相加前 a 的形狀為 (4, 1), b 的形狀為 (3, ), a+b 的結果的形狀為(4, 3)。計算時,變換結果與上圖類似,這裡來詳細介紹下:
>>> a
array([[ 0], [10],[20], [30]])
>>> a2 = np.array(([ i * 3 for i in a.tolist()])) # 會先將a轉為a2
>>> a2
array([[ 0,  0,  0],
      [10, 10, 10],
      [20, 20, 20],
      [30, 30, 30]])
>>> b
array([0, 1, 2])
>>> b2 = np.array([b.tolist()] * 4) # 再將b轉為b2
>>> b2
array([[0, 1, 2],
      [0, 1, 2],
      [0, 1, 2],
      [0, 1, 2]])
>>> a2 + b2 # a2 + b2的結果就是 a + b 的結果
array([[ 0,  1,  2],
      [10, 11, 12],
      [20, 21, 22],
      [30, 31, 32]])

腦洞科技棧專注於人工智慧與量化投資領域

瞭解更多幹貨文章,關注小程式八斗問答