深度學習筆記(5)Broadcasting in Python 廣播

Mr.zwX發表於2020-12-17

廣播是一種手段,可以讓Python程式碼段執行速度更快,同時會減少你的程式碼量。

引例:現在有4種不同的食物,如圖矩陣種列出每100g食物中碳水化合物、蛋白質、脂肪所提供的熱量值。試問:如何求每種食物中每一種營養物質熱量的佔比?
在這裡插入圖片描述
道理很簡單,其實就是把每一列求和,再分別求出每一個值與該列和的比值。值得思考的是,在這個問題中,我們應該怎麼樣避開for迴圈編寫程式?

import numpy as np

A = np.array([[56.0, 0.0, 4.4, 68.0],
            [1.2, 104.0, 52.0, 8.0],
            [1.8, 135.0, 99.0, 0.9]])

print(A)

cal = A.sum(axis = 0) # 縱向求和 axis=1橫向求和
percentage = 100*A/(cal.reshape(1,4)) # reshape確保形狀是想要的
print(cal)
print(percentage)

在這裡插入圖片描述
舉三個簡單的例子來說明Python廣播手段的實現效果。

[ 1 2 3 ] + 100 = [ 1 2 3 ] + [ 100 100 100 ] = [ 101 102 103 ] . \left[ \begin{matrix} 1\\2\\3\end{matrix} \right]+100=\left[ \begin{matrix} 1\\2\\3\end{matrix} \right]+\left[ \begin{matrix} 100\\100\\100\end{matrix} \right]=\left[ \begin{matrix} 101\\102\\103\end{matrix} \right]. 123+100=123+100100100=101102103.

[ 1 2 3 4 5 6 ] + [ 100 200 300 ] = [ 1 2 3 4 5 6 ] + [ 100 200 300 100 200 300 ] = [ 101 202 303 104 205 306 ] . \left[ \begin{matrix} 1&2&3\\4&5&6\end{matrix} \right]+\left[ \begin{matrix} 100&200&300\end{matrix} \right]=\left[ \begin{matrix} 1&2&3\\4&5&6\end{matrix} \right]+\left[ \begin{matrix} 100&200&300\\100&200&300\end{matrix} \right]=\left[ \begin{matrix} 101&202&303\\104&205&306\end{matrix} \right]. [142536]+[100200300]=[142536]+[100100200200300300]=[101104202205303306].

[ 1 2 3 4 5 6 ] + [ 100 200 ] = [ 1 2 3 4 5 6 ] + [ 100 100 100 200 200 200 ] = [ 101 102 103 204 205 206 ] \left[ \begin{matrix} 1&2&3\\4&5&6\end{matrix} \right]+\left[ \begin{matrix} 100\\200\end{matrix} \right]=\left[ \begin{matrix} 1&2&3\\4&5&6\end{matrix} \right]+\left[ \begin{matrix} 100&100&100\\200&200&200\end{matrix} \right]=\left[ \begin{matrix} 101&102&103\\204&205&206\end{matrix} \right] [142536]+[100200]=[142536]+[100200100200100200]=[101204102205103206]

簡而言之,維度較低(不管行還是列維度)的矩陣需要橫向/縱向複製,達到維度更高的矩陣形態。

相關文章