我在一些代码中遇到了numpy.apply_along_axis函数。我也不明白这方面的文件。
以下是文档示例:
>>> def new_func(a):
... """Divide elements of a by 2."""
... return a * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(new_func, 0, b)
array([[ 0.5, 1. , 1.5],
[ 2. , 2.5, 3. ],
[ 3.5, 4. , 4.5]])
就我所理解的文档而言,我希望:
array([[ 0.5, 1. , 1.5],
[ 4 , 5 , 6 ],
[ 7 , 8 , 9 ]])
即沿着轴**[1,2,3](即[1,2,3],[4,5,6],[7,8,9]中的轴0**)应用函数
显然我错了。你能纠正我吗?
3条答案
按热度按时间but5z9lq1#
apply_along_axis
沿着输入数组的1D切片应用提供的函数,切片沿指定的轴截取。因此,在您的示例中,new_func
应用于数组沿着第一个轴的每个切片。如果你使用一个向量值函数,而不是一个标量,它会变得更清晰,就像这样:这里,
numpy.diff
(即相邻阵列元素的算术差)沿着输入阵列的第一或第二轴(维度)的每个切片应用。wlp8pajw2#
该函数在沿着轴=0的1-d阵列上执行。您可以使用“axis”参数指定另一个轴。该范例的用法是:
对沿着维度0的每个子阵列执行该函数。因此,它适用于一维函数,并为每个一维输入返回一个一维数组。
另一个例子是:
为一维数组提供标量输出。当然,你可以只在cumsum或sum中设置axis参数来完成上面的操作,但这里的要点是,它可以用于你编写的任何一维函数。
7ajki6be3#
你的错误来自于两个误解,即轴0到底是什么,以及apply_沿着_axis应该用于什么:
误解一:
在你的数组中,轴0是不是[1,2,3],它将在b[0,:]中找到,并表示轴1的第一个切片。从轴0开始的第一个切片用索引**B[:,0]**找到,这将返回[1,4,7]。从轴0开始的3个切片或向量将执行计算:
误区二:
你想应用的函数实际上是元素方面的。在改变轴时,你不会看到任何差异,因为该操作并不应用于轴,而是独立地应用于每个元素,并且不会影响数组的形状:
现在,让我们再深入一点,对矩阵进行平方,以便在每个元素之间添加更多变化,并执行np.diff,如该字段中的另一个答案所示:
让我们取轴0的每一个切片,并将np.diff应用于每个切片:
回想一下,np.diff函数等价于:
此函数返回X[i+1]-X[i]与i=[0,len(X)-1]之间的差值,其中X是一个向量
因此,函数np.diff的结果沿着轴0应用:
最后,你可能会期待这个答案,而不是上面的那个:
然后回到原始数组,并理解函数np.diff应用于轴,因此从numpy的Angular 来看是垂直的