scipy numpy.apply_沿着_axis具体执行什么?

ldxq2e6h  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(312)

我在一些代码中遇到了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**)应用函数
显然我错了。你能纠正我吗?

but5z9lq

but5z9lq1#

apply_along_axis沿着输入数组的1D切片应用提供的函数,切片沿指定的轴截取。因此,在您的示例中,new_func应用于数组沿着第一个轴的每个切片。如果你使用一个向量值函数,而不是一个标量,它会变得更清晰,就像这样:

In [20]: b = np.array([[1,2,3], [4,5,6], [7,8,9]])

In [21]: np.apply_along_axis(np.diff,0,b)
Out[21]: 
array([[3, 3, 3],
       [3, 3, 3]])

In [22]: np.apply_along_axis(np.diff,1,b)
Out[22]: 
array([[1, 1],
       [1, 1],
       [1, 1]])

这里,numpy.diff(即相邻阵列元素的算术差)沿着输入阵列的第一或第二轴(维度)的每个切片应用。

wlp8pajw

wlp8pajw2#

该函数在沿着轴=0的1-d阵列上执行。您可以使用“axis”参数指定另一个轴。该范例的用法是:

np.apply_along_axis(np.cumsum, 0, b)

对沿着维度0的每个子阵列执行该函数。因此,它适用于一维函数,并为每个一维输入返回一个一维数组。
另一个例子是:

np.apply_along_axis(np.sum, 0, b)

为一维数组提供标量输出。当然,你可以只在cumsum或sum中设置axis参数来完成上面的操作,但这里的要点是,它可以用于你编写的任何一维函数。

7ajki6be

7ajki6be3#

你的错误来自于两个误解,即轴0到底是什么,以及apply_沿着_axis应该用于什么:
误解一:
在你的数组中,轴0是不是[1,2,3],它将在b[0,:]中找到,并表示轴1的第一个切片。从轴0开始的第一个切片用索引**B[:,0]**找到,这将返回[1,4,7]。从轴0开始的3个切片或向量将执行计算:

>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> b[:,0]
array([1, 4, 7])
>>> b[:,1]
array([2, 5, 8])
>>> b[:,2]
array([3, 6, 9])

误区二:
你想应用的函数实际上是元素方面的。在改变轴时,你不会看到任何差异,因为该操作并不应用于轴,而是独立地应用于每个元素,并且不会影响数组的形状:

>>> b*0.5
array([[0.5, 1. , 1.5],
       [2. , 2.5, 3. ],
       [3.5, 4. , 4.5]])

现在,让我们再深入一点,对矩阵进行平方,以便在每个元素之间添加更多变化,并执行np.diff,如该字段中的另一个答案所示:

>>> b**=2
>>> b
array([[ 1,  4,  9],
       [16, 25, 36],
       [49, 64, 81]])

让我们取轴0的每一个切片,并将np.diff应用于每个切片:

>>> b[:,0]
array([ 1, 16, 49])
>>> np.diff(b[:,0])
array([15, 33])

>>> b[:,1]
array([ 4, 25, 64])
>>> np.diff(b[:,1])
array([21, 39])

>>> b[:,2]
array([ 9, 36, 81])
>>> np.diff(b[:,2])
array([27, 45])

回想一下,np.diff函数等价于:

>>> b[1::,0]-b[0:-1,0]
array([15, 33])

此函数返回X[i+1]-X[i]与i=[0,len(X)-1]之间的差值,其中X是一个向量
因此,函数np.diff的结果沿着轴0应用:

>>> np.apply_along_axis(np.diff, 0, b)
array([[15, 21, 27],
       [33, 39, 45]])

最后,你可能会期待这个答案,而不是上面的那个:

array([[15, 33],
       [21, 39],
       [27, 45]])

然后回到原始数组,并理解函数np.diff应用于轴,因此从numpy的Angular 来看是垂直的

相关问题