第十五篇:Python 中的廣播 (Broadcasting in python)

1、實例:

        下面列表是不同食物(每100g)中不同營養成分的卡路里含量表格,表格爲3行4列,列表示不同的食物種類,從左至右依次爲蘋果,牛肉,雞蛋,土豆。行表示不同的營養成分,從上到下依次爲碳水化合物,蛋白質,脂肪。那麼,我們現在想要計算不同食物中不同營養成分中的卡路里百分比。

現在計算蘋果中的碳水化合物卡路里百分比含量,首先計算蘋果(100g)中三種營養成分卡路里總和 56+1.2+1.8=59,然後用56/59=94.9%算出結果。

對於其他食物,計算方法類似。首先,按列求和,計算每種食物中(100g)三種營養成分總和,然後分別用不用營養成分的卡路里數量除以總和,計算百分比。

  • 那麼,能否不使用for循環完成這樣的一個計算過程?我們可以使用python的numpy庫完成這樣的計算過程,分兩步:

1、對每一列進行求和,可以看到輸出的是每種食物(100g)的卡路里總和;

  ps:下面再來解釋一下 A.sum(axis = 0)中的參數axis。axis用來指明將要進行的運算是沿着哪個軸執行,在numpy中,0軸是垂直的,也就是列,而1軸是水平的,也就是行。

 

        2、分別計算每種食物每種營養成分的百分比,將3x4的矩陣除以一個1x4的矩陣,得到一個3x4的結果矩陣,這個結果矩陣就是我們要求的百分比含量。

 ps:對於A/cal.reshape(1, 4)指令則調用了numpy中的廣播機制。這裏使用3×4的矩陣A除以1×4的矩陣cal。技術上來講,其實並不需要再將矩陣cal- reshape(重塑)成1×4,因爲矩陣cal本身已經是1×4了。但是當我們寫代碼時不確定矩陣維度的時候,通常會對矩陣進行重塑來確保得到我們想要的列向量或行向量。重塑操作reshape是一個常量時間的操作,時間複雜度是O(1), 它的調用代價極低。

廣播機制的一般原則:

 說明:

          矩陣 A_{m*n}和矩陣 B_{1*m} 進行四則運算,後緣維度軸長度相符,可以廣播,廣播沿着軸長度爲1的軸進行,即 B_{m*n}, 廣播成爲 B_{m*n},之後做逐元素四則運算。

          矩陣A_{m*n}和矩陣 B_{m*1}進行四則運算,後緣維度軸長度不相符,但其中一方軸長度爲1,可以廣播,廣播沿着軸長度爲1的軸進行,即𝐵𝑚∗1廣播成爲𝐵𝑚∗𝑛',之後做逐元素四則運算。

          矩陣 A_{m*1}和常數 R 進行四則運算,後緣維度軸長度不相符,但其中一方軸長度爲1,可以廣播,廣播沿着缺失維度和軸長度爲1的軸進行,缺失維度就是axis=0,軸長度爲1的軸是axis=1,即R廣播成爲B_{m*1},之後做逐元素四則運算。

        如果兩個數組的後緣維度的軸長度相符或其中一方的軸長度爲1,則認爲它們是廣播兼容的。廣播會在缺失維度和軸長度爲1的維度上進行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章