在Python中理解轴

pce*_*con 6 python axis numpy matrix

我已经看到了几个代码使用numpy.apply_along_axis,我总是要测试代码,看看它是如何工作的,因为我还没有理解axisPython中的想法.

例如,我从参考文献中测试了这个简单的代码.

我可以看到,对于第一种情况,它采用了矩阵每行的第一列,而在第二种情况下,考虑了行本身.

所以我构建了一个例子来测试它如何与一个矩阵数组合(这个问题带我到这个轴问题),它也可以看作是一个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)
Run Code Online (Sandbox Code Playgroud)

哪个给了我:

array([[ 2.5,  3.5,  4.5],
       [ 5.5,  5.5,  5.5]])
Run Code Online (Sandbox Code Playgroud)

和:

array([[ 1.5,  2.5,  3.5],
       [ 6.5,  6.5,  6.5]])
Run Code Online (Sandbox Code Playgroud)

对于第一个结果,我得到了我的预期.但对于第二个,我会收到:

array([[ 2.,  3.],
       [ 5.,  8.]])
Run Code Online (Sandbox Code Playgroud)

然后,我可能应该是一个axis=2,我得到了以前的测试结果.所以,我想知道这是如何正常工作的.

谢谢.

CT *_*Zhu 2

首先,data=numpy.array(a)已经足够了,不需要使用numpy.array([b for b in a])

data现在是 3Dndarray形状(2,2,3),并且有 3 个轴0, 1, 2。第一个轴的长度为 2,第二个轴的长度也是 2,第三个轴的长度为 3。

因此 和numpy.apply_along_axis(my_func, 0, data)都会numpy.apply_along_axis(my_func, 1, data)产生形状为 的二维数组(2,3)。在这两种情况下,形状都是(2,3),其余轴的形状,第二和第三或第一和第三。

numpy.apply_along_axis(my_func, 2, data)返回(2,2)您显示的形状数组,其中是沿着第三个轴(通过给出 index )(2,2)时前两个轴的形状。apply2

理解它的方法是,无论您沿哪个轴应用,都将“折叠”为您的形状my_func,在本例中返回单个值。其余轴的顺序和形状将保持不变。

另一种思考方式是:apply_along_axis对于剩余轴的每个组合,将该函数应用于该轴上的值。获取结果,并将它们组织回剩余轴的形状。因此,如果my_func返回tuple4 个值中的 a:

def my_func(x):
    return (x[0] + x[-1]) * 2,1,1,1
Run Code Online (Sandbox Code Playgroud)

我们预计会numpy.apply_along_axis(my_func, 0, data).shape(4,2,3)