我已经看过使用numpy.apply_along_axis的一些代码,而且我总是必须测试这些代码才能看到它是如何工作的,因为我还不了解Python中的axis想法。

例如,我从引用中测试了this简单代码。

我可以看到,在第一种情况下,它是矩阵每一行的第一列,在第二种情况下,是考虑了行本身。

因此,我构建了一个示例来测试它如何与矩阵阵列(这个问题带给我这个轴问题)一起工作,该矩阵也可以看作是3d矩阵,其中每一行都是一个矩阵,对吗?

a = [[[1,2,3],[2,3,4]],[[4,5,6],[9,8,7]]]

import numpy
data = numpy.array([b for b in a])

def my_func(x):
    return (x[0] + x[-1]) * 0.5

b = numpy.apply_along_axis(my_func, 0, data)
b = numpy.apply_along_axis(my_func, 1, data)

这给了我:
array([[ 2.5,  3.5,  4.5],
       [ 5.5,  5.5,  5.5]])

和:
array([[ 1.5,  2.5,  3.5],
       [ 6.5,  6.5,  6.5]])

对于第一个结果,我得到了我所期望的。但是对于第二个,我虽然会收到:
array([[ 2.,  3.],
       [ 5.,  8.]])

然后我虽然那可能应该是一个axis=2,但我得到了之前测试它的结果。因此,我想知道这如何正常工作。

谢谢你。

最佳答案

首先,data=numpy.array(a)已经足够,无需使用numpy.array([b for b in a])
data现在是具有ndarray形状的3D (2,2,3) ,并且具有3个轴0, 1, 2。第一 Axis 的长度为2,第二 Axis 的长度也为2,第三 Axis 的长度为3。

因此,numpy.apply_along_axis(my_func, 0, data)numpy.apply_along_axis(my_func, 1, data)都将生成二维(2,3)形状的数组。在这两种情况下,形状均为(2,3),其余 Axis 的形状分别为2nd和3rd或1st和3rd。
numpy.apply_along_axis(my_func, 2, data)返回您显示的(2,2)形状数组,其中(2,2)是前两个轴的形状,就像沿着第3 Axis 的apply一样(通过给索引2)。

理解的方式是您沿哪个轴应用都会折叠到my_func的形状中,在这种情况下apply_along_axis返回单个值。其余 Axis 的顺序和形状将保持不变。

另一种思考方式是:my_func意味着针对其余 Axis/Axis 的每种组合,将该函数应用于该 Axis 上的值。获取结果,然后将它们重新组织成其余 Axis/Axis 的形状。因此,如果tuple返回4个值的numpy.apply_along_axis(my_func, 0, data).shape:

def my_func(x):
    return (x[0] + x[-1]) * 2,1,1,1

我们期望(4,2,3)numpy.apply_over_axes
  • 另请参阅 ojit_code 以在多个轴上重复应用函数
  • 关于python - 了解Python中的 Axis ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23349128/

    10-15 12:56