[英]Best way to apply a function to a slice of a 3d numpy array
假设我有像myArray.shape == (100, 80, 2)
这样的东西
我想做这样的事情: numpy.apply_along_axis(function, 0, myArray)
其中function
使用numpy.apply_along_axis(function, 0, myArray)
的axis=2
轴上的两个项目,但我知道numpy.apply_along_axis
仅适用于1D切片。
我的问题是:是否有一种通用的方法可以在不使用循环的情况下将函数用于2D切片,还是取决于我如何定义function
? 如果是这样,最有效的方法是什么?
是否可以使用numpy.apply_along_axis
作用于一个1D切片并将另一个切片中的每个元素zip
到第一个切片中的每个元素? 重组myArray
帮助吗?
注意:这个问题没有回答我的问题,所以请不要标记为重复。
定义一个采用二维数组的简单函数,并返回一个标量
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])
原始的矢量化不承诺任何加速,签名版本甚至有点慢。
apply_along_axis
只是隐藏迭代。 尽管它只在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])
只要您只在一个轴上进行迭代,列表推导方法既快又简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.