我要调整你的例子,使其更有趣一些
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
比较慢,可能是因为它正试图更加普遍。这可能更方便,但它并不明显更“有效”。