我整理的一些關(guān)于Python的項目學(xué)習(xí)資料+視頻(附講解~~)和大家一起分享、學(xué)習(xí)一下:
https://d.51cto.com/wO38C1
2.15 Python 中的廣播 Broadcasting in Python
觀察上圖。
這是一個不同食物(每100g)中不同營養(yǎng)成分的卡路里含量表格,表格為3行4列。
現(xiàn)在想要計算不同食物中不同營養(yǎng)成分中的卡路里百分比。
以計算蘋果中的碳水化合物卡路里百分比含量為例。
首先計算蘋果(100g)中三種營養(yǎng)成分卡路里總和56+1.2+1.8 = 59,然后用56/59 = 94.9%算出結(jié)果??梢钥闯鎏O果中的卡路里大部分來自于碳水化合物,而牛肉則不同。
對于其他食物,計算方法類似。先按列求和,得到每種食物的三種營養(yǎng)成分總和,然后分別用不同營養(yǎng)成分的卡路里數(shù)量除以總和,計算百分比。
問題來了,是否可以不用顯示的for循環(huán)完成所有計算?
我們把上面的表格等于 3 x 4 的矩陣A。然后用1行代碼對列求和,得到4個數(shù)字,表示4種食物的卡路里總量。最后用第二行代碼把每個元素都除以對應(yīng)的列之和,得到每種食物每種營養(yǎng)成分的百分比。
代碼如下
運(yùn)行結(jié)果
注意: A.sum(axis = 0),axis表示沿著哪個軸求和。0表示是垂直的,也就是列;1表示水平的,也就是行。
percentage=100*A/cal.reshape(1,4)則調(diào)用了numpy中的廣播機(jī)制。
這里使用3x4的矩陣A除以 1x4 的矩陣cal。從技術(shù)上說,執(zhí)行第一行代碼后,變量cal已經(jīng)是一個1x4矩陣了,不需要reshape(重塑)成1x4,似乎有點(diǎn)多余。但是,當(dāng)我們寫代碼時不確定矩陣維度(尺寸)的時候,通常會對矩陣進(jìn)行重塑來確保得到我們想要的(正確的)列向量或行向量。
reshape是一個常用時間的操作,時間復(fù)雜度是O(1),它的調(diào)用代價極低。不要害怕使用reshape來得到你需要的矩陣形狀。
現(xiàn)在的問題是,你怎么讓一個3x4的矩陣除以1x4的矩陣呢?
例1
如上圖。在python中,當(dāng)一個 4x1 的列向量與一個常數(shù)做加法時,實(shí)際上會將常數(shù)擴(kuò)展為一個 4x1 的列向量,然后兩者做逐元素加法,結(jié)果就是右邊的這個向量。這種廣播機(jī)制對于行向量和列向量均可以使用。前面介紹邏輯回歸時候曾經(jīng)說過,常數(shù)b也是這樣擴(kuò)展的。
例2
再看上圖。用一個 2x3 的矩陣和一個 1x3 的矩陣相加,或者擴(kuò)展到一般情況,讓一個m x n的矩陣和一個1 x n的矩陣相加。python把1xn的矩陣復(fù)制m次,把它變成一個m x n的矩陣。所以,上圖中1x3的矩陣會變成2x3的矩陣,然后再和第一個的2x3矩陣逐個元素相加。這里就和我們計算percentage時候處理方法完全一樣了,只不過計算percentage用的是除法。
例3
如上圖。這里相當(dāng)于是一個 2x3 或者說m x n 的矩陣加上一個 2x1 或者說m x 1的矩陣。在進(jìn)行運(yùn)算時,會先將m x 1矩陣水平復(fù)制n次,變成一個 m x n的矩陣,然后再逐個元素相加。
總結(jié):python中廣播的通用規(guī)則
對于1個m x n的矩陣,如果要加減乘除1個 1 x n的矩陣,python首先會把1 x n的矩陣復(fù)制m次(按行復(fù)制),變成一個m x n的矩陣,然后逐個元素加減乘除。對于1個m x n的矩陣,如果要加減乘除1個 m x 1的矩陣,python首先會把m x 1的矩陣復(fù)制n次(按列復(fù)制),同樣變成一個m x n的矩陣,然后逐個元素加減乘除。對于1個m x 1的矩陣(列向量),如果要加減乘除1個實(shí)數(shù),那就是把實(shí)數(shù)復(fù)制m次,得到另外1個m x 1的矩陣,然后逐個元素加減乘除對于1個1 x n的矩陣(行向量),如果要加減乘除1個實(shí)數(shù),那就是把實(shí)數(shù)復(fù)制n次,得到另外1個1 x n的矩陣,然后逐個元素加減乘除在numpy文檔中搜索broadcasting可以獲得詳細(xì)說明。
習(xí)慣用Matlab/Octave 編程的人,可能會用有類似功能的函數(shù)bsxfun。不過NN只需要python就可以了。
整理的一些關(guān)于Python的項目學(xué)習(xí)資料+視頻(附講解~~),需要自取
https://d.51cto.com/wO38C1
本文章為轉(zhuǎn)載內(nèi)容,我們尊重原作者對文章享有的著作權(quán)。如有內(nèi)容錯誤或侵權(quán)問題,歡迎原作者聯(lián)系我們進(jìn)行內(nèi)容更正或刪除文章。
贊 收藏 評論 舉報相關(guān)文章