淺談numpy廣播機制
Broadcast
廣播是numpy對不同形狀(shape)的數組進行數值計算的方式,對數組的算術運算通常在相應的元素上進行。如果兩個數組a和b形狀相同,即a.shape==b.shape為True時,那么a*b的結果就是a與b數組的對應位相乘。這要求維數相同,并且各維度的長度相同。
例如:
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a*b) # 運行結果為array([4,10,18])
最簡單的廣播機制
當一個常數與一個array對象相乘時,這時就會觸發(fā)numpy的廣播機制
import numpy as np a = np.array([1, 2, 3]) print(a*2) # 運行結果為array([2,4,6])
或許你把這當作理所應當,但是這就是通過廣播機制來實現(xiàn)的。

稍微復雜的廣播機制
import numpy as np
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([1, 2, 3])
print(a+b)輸出結果是:
array([[ 1, 2, 3],
[11, 12, 13],
[21, 22, 23],
[31, 32, 33]])
初學者可能認為這樣的運算會報錯,但是這的確是正確的,原因還是廣播機制
廣播機制到底做了什么
我們觀察上面這個稍顯復雜的例子:
a.shape=(4,3)而b.shape=(1,3),兩個矩陣axis=1的數據寬度是相同的,但是axis=0的數據寬度不一樣,并且b.shape[0]=1,這就是廣播機制的觸發(fā)條件,這時numpy會把b沿axis=0的方向復制4份,即形狀變成(4, 3),與a的一致,接下來就是對應位相加即可。
如下圖:

一個典型的錯誤案例

import numpy as np
a = np.array([[0, 0, 0],
[10, 10, 10],
[20, 20, 20],
[30, 30, 30]])
b = np.array([0, 1, 2, 3])
a+b提示無法進行廣播:

能否廣播必須從axis的最大值向最小值看去,依次對比兩個要進行運算的數組的axis的數據寬度是否相等,如果在某一個axis下,一個數據寬度為1,另一個數據寬度不為1,那么numpy就可以進行廣播;但是一旦出現(xiàn)了在某個axis下兩個數據寬度不相等,并且兩者全不為1的狀況,就無法廣播。
一個正確的經典示例
import numpy as np a = np.arange(6).reshape((2, 3, 1)) b = np.arange(6).reshape((1, 3, 2)) print(a) print(b) print(a+b) print((a+b).shape)
結果:
a是:
array([[[0],
[1],
[2]],[[3],
[4],
[5]]])
b是:
array([[[0, 1],
[2, 3],
[4, 5]]])
a+b是:
array([[[ 0, 1],
[ 3, 4],
[ 6, 7]],[[ 3, 4],
[ 6, 7],
[ 9, 10]]])
運算過程是:
1不等于2,所以對a的axis=2進行廣播,a變?yōu)?/p>
array([[[0,0],
[1,1],
[2,2]],
[[3,3],
[4,4],
[5,5]]])axis=1時3等于3,不進行廣播
axis=0時,2不等于1,所以對b的axis=0進行廣播,b變?yōu)椋?/p>
array([[[0, 1],
[2, 3],
[4, 5]],
[[0, 1],
[2, 3],
[4, 5]]])最后a、b的shape變?yōu)橐粯?,運算結果即為:
array([[[ 0, 1],
[ 3, 4],
[ 6, 7]],
[[ 3, 4],
[ 6, 7],
[ 9, 10]]])一種更便捷的計算方式
注:np.newaxis表示增加一個數據寬度為1的維度
因此a[:, np.newaxis] = array([[0],[10],[20],[30]])
import numpy as np a = np.array([0, 10, 20, 30]) b = np.array([0, 1, 2]) a[:, np.newaxis]+b
結果:
array([[ 0, 1, 2],
[10, 11, 12],
[20, 21, 22],
[30, 31, 32]])
廣播過程:

到此這篇關于淺談numpy廣播機制的文章就介紹到這了,更多相關numpy廣播機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python2 與python3的print區(qū)別小結
這篇文章主要介紹了python2 與python3的print區(qū)別小結,需要的朋友可以參考下2018-01-01
python GUI庫圖形界面開發(fā)之PyQt5時間控件QTimer詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5時間控件QTimer詳細使用方法與實例,需要的朋友可以參考下2020-02-02
Python的Flask框架應用程序實現(xiàn)使用QQ賬號登錄的方法
利用QQ開放平臺的API使用QQ賬號登錄是現(xiàn)在很多網站都具備的功能,而對于Flask框架來說則有Flask-OAuthlib這個現(xiàn)成的輪子,這里我們就來看一下Python的Flask框架應用程序實現(xiàn)使用QQ賬號登錄的方法2016-06-06

