繁体   English   中英

将函数应用于3d numpy数组切片的最佳方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM