在Python中理解轴

时间:2014-04-28 18:59:29

标签: python numpy matrix axis

我看过几个使用numpy.apply_along_axis的代码,我总是要测试代码,看看它是如何工作的,因为我还没理解Python中的axis想法。

例如,我测试了参考文献中的this个简单代码。

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

所以我构建了一个例子来测试它是如何使用矩阵数组的(这个问题带我到这个轴问题),它也可以看作是一个3d矩阵,其中每一行都是一个矩阵,对吗? / p>

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,我得到了之前测试的结果。所以,我想知道这是如何正常工作的。

谢谢。

3 个答案:

答案 0 :(得分:2)

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

data现在是形状为(2,2,3)的3D ndarray,并且有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)的2D数组。在这两种情况下,形状为(2,3),其余轴为第2和第3或第1和第3。

numpy.apply_along_axis(my_func, 2, data)会返回您显示的(2,2)形状数组,其中(2,2)是前2轴的形状,就像apply沿第3轴(通过给出索引) 2)。

理解它的方法是,无论你应用哪个轴,都会'折叠'成my_func的形状,在这种情况下会返回一个值。剩余轴的顺序和形状将保持不变。

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

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

我们希望numpy.apply_along_axis(my_func, 0, data).shape(4,2,3)

答案 1 :(得分:2)

array shape (2,2,3)。可以看出axis 0axis 1axis 2分别具有2,2,3个数据值。

这些是数组元素的索引

[
    [
        [(0,0,0) (0,0,1), (0,0,2)],
        [(0,1,0) (0,1,1), (0,1,2)]
    ],
    [
        [(1,0,0) (1,0,1), (1,0,2)],
        [(1,1,0) (1,1,1), (1,1,2)]
    ]
]

现在如果沿某个轴应用某些操作,则沿着此轴改变索引,只保持沿另外两个轴的索引不变

示例:如果我们沿axis 0应用一些操作F,那么结果的元素将是

[
    [F((0,0,0),(1,0,0)), F((0,0,1),(1,0,1)), F((0,0,2),(1,0,2))],
    [F((0,1,0),(1,1,0)), F((0,1,1),(1,1,1)), F((0,1,2),(1,1,2))]
]

沿着axis 1

[
    [F((0,0,0),(0,1,0)), F((0,0,1),(0,1,1)), F((0,0,2),(0,1,2))],
    [F((0,1,0),(1,1,0)), F((0,1,1),(1,1,1)), F((0,1,2),(1,1,2))]
]

沿着axis 2

[
    [F((0,0,0),(0,0,1),(0,0,2)), F((0,1,0),(0,1,1),(0,1,2))],
    [F((1,0,0),(1,0,1),(1,0,2)), F((1,1,0),(1,1,1),(1,1,2))]
]

也可以通过以给定数据的形状省略给定轴来推断得到的数组的形状。

答案 2 :(得分:1)

也许检查阵列的形状有助于澄清哪个轴是哪个;

print data.shape

>> (2,2,3)

这意味着调用

numpy.apply_along_axis(my_func, 2, data)

确实应该给出2x2矩阵,即

array([[ 2.,  3.],
      [ 5.,  8.]])

因为第3轴(索引2)的长度为3,而其余轴的长度均为2。