我要調整你的例子,使其更有趣一些
In [188]: tmp=np.arange(6.).reshape(2,3)
In [189]: lol=lambda first, second: np.sum(first)/second
因此,與2D tmp中,我們可以沿着任一軸應用它
In [190]: np.apply_along_axis(lol,0,tmp,2)
Out[190]: array([ 1.5, 2.5, 3.5])
In [191]: np.apply_along_axis(lol,1,tmp,2)
Out[191]: array([ 1.5, 6. ])
另一個lambda
乾淨切換參數:
In [192]: np.apply_along_axis(lambda x,y:lol(y,x),0,tmp,2)
Out[192]:
array([[ inf, 2. , 1. ],
[ 0.66666667, 0.5 , 0.4 ]])
(與2/tmp
相同; axis does not ma tter)
函數調用的額外層不會改變執行速度太多(切換參數會增加時間,但我想關注額外lambda
的影響)。
In [195]: timeit np.apply_along_axis(lol,1,tmp,2)
10000 loops, best of 3: 103 us per loop
In [196]: timeit np.apply_along_axis(lambda x,y:lol(x,y),1,tmp,2)
10000 loops, best of 3: 105 us per loop
關於使用apply_along_axis
沒有什麼不可思議的或特別有效的;你(或我們)可以寫一個迭代來做同樣的事情。
讓我們來比較2倍的表達,一個apply_along_axis
和等價列表理解:
In [213]: np.apply_along_axis(lol,0,tmp,2)
Out[213]: array([ 1.5, 2.5, 3.5])
In [214]: np.array([lol(tmp[:,i],2) for i in range(tmp.shape[1])])
Out[214]: array([ 1.5, 2.5, 3.5])
In [215]: timeit np.apply_along_axis(lol,0,tmp,2)
10000 loops, best of 3: 132 us per loop
In [217]: timeit np.array([lol(tmp[:,i],2) for i in range(tmp.shape[1])])
10000 loops, best of 3: 64.1 us per loop
apply_along_axis
比較慢,可能是因爲它正試圖更加普遍。這可能更方便,但它並不明顯更「有效」。