Python 将函数应用于3d numpy阵列切片的最佳方法
假设我有类似于Python 将函数应用于3d numpy阵列切片的最佳方法,python,arrays,numpy,Python,Arrays,Numpy,假设我有类似于myArray.shape==(100,80,2) 我想这样做: numpy.沿轴应用(函数,0,myArray) 其中function使用myArray的axis=2轴上的两个项目,但我知道numpy。沿
myArray.shape==(100,80,2)
我想这样做:
numpy.沿轴应用(函数,0,myArray)
其中function
使用myArray的axis=2
轴上的两个项目,但我知道numpy。沿
仅适用于1D切片
我的问题是:是否有一种通用的方法可以在不使用循环的情况下对2D切片执行函数,还是取决于我如何定义函数
?如果是这样,最有效的方法是什么
是否可以使用numpy.apply_沿_轴
作用于一个1D切片,而zip
另一个切片中的每个元素以某种方式作用于第一个切片中的每个元素?重组myArray是否有帮助
注意:这并没有回答我的问题,所以请不要将其标记为重复。定义一个简单的函数,该函数采用2d数组,并返回标量
In [54]: def foo(x):
...: assert(x.ndim == 2)
...: return x.mean()
...:
In [55]: X = np.arange(24).reshape(2,3,4)
现在还不完全清楚如何在3d数组上迭代,但我们假设它位于第一个轴上。直截了当的列表理解方法是:
In [56]: [foo(x) for x in X]
Out[56]: [5.5, 17.5]
vectorize
通常为函数提供标量,但较新版本具有signature
参数,允许我们将其用作:
In [58]: f = np.vectorize(foo, signature='(n,m)->()')
In [59]: f(X)
Out[59]: array([ 5.5, 17.5])
最初的矢量化不保证任何加速,签名版本甚至有点慢
沿_轴应用_
仅隐藏迭代。即使它只在1d阵列上运行,我们也可以使用它进行一些重塑:
In [62]: np.apply_along_axis(lambda x: foo(x.reshape(3,4)), 1, X.reshape(2,-1))
Out[62]: array([ 5.5, 17.5])
只要您只在一个轴上迭代,列表理解方法就是最快和最简单的。“这取决于我如何定义函数吗?”。。。是的,非常喜欢。
apply\u-alow
使用循环。你想做什么还不完全清楚。向我们展示一个显式循环。