通过int选择numpy数组轴

M D*_*vid 5 python arrays numpy multidimensional-array

我正在尝试系统地访问 numpy 数组的轴。例如,假设我有一个数组

a = np.random.random((10, 10, 10, 10, 10, 10, 10))
# choosing 7:9 from axis 2
b = a[:, :, 7:9, ...]
# choosing 7:9 from axis 3
c = a[:, :, :, 7:9, ...]
Run Code Online (Sandbox Code Playgroud)

如果我有一个高维数组,输入冒号会变得非常重复。现在,我想要一些choose_from_axis这样的功能

# choosing 7:9 from axis 2
b = choose_from_axis(a, 2, 7, 9)
# choosing 7:9 from axis 3
c = choose_from_axis(a, 3, 7, 9)
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我想访问一个带有数字的轴。我知道如何做到这一点的唯一方法是rollaxis来回使用,但我正在寻找一种更直接的方法来做到这一点。

wim*_*wim 8

听起来您可能正在寻找take

>>> a = np.random.randint(0,100, (3,4,5))
>>> a[:,1:3,:]
array([[[61,  4, 89, 24, 86],
        [48, 75,  4, 27, 65]],

       [[57, 55, 55,  6, 95],
        [19, 16,  4, 61, 42]],

       [[24, 89, 41, 74, 85],
        [27, 84, 23, 70, 29]]])
>>> a.take(np.arange(1,3), axis=1)
array([[[61,  4, 89, 24, 86],
        [48, 75,  4, 27, 65]],

       [[57, 55, 55,  6, 95],
        [19, 16,  4, 61, 42]],

       [[24, 89, 41, 74, 85],
        [27, 84, 23, 70, 29]]])
Run Code Online (Sandbox Code Playgroud)

这也将为您提供对元组索引的支持。例子:

>>> a = np.arange(2*3*4).reshape(2,3,4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> a[:,:,(0,1,3)]
array([[[ 0,  1,  3],
        [ 4,  5,  7],
        [ 8,  9, 11]],

       [[12, 13, 15],
        [16, 17, 19],
        [20, 21, 23]]])
>>> a.take((0,1,3), axis=2)
array([[[ 0,  1,  3],
        [ 4,  5,  7],
        [ 8,  9, 11]],

       [[12, 13, 15],
        [16, 17, 19],
        [20, 21, 23]]])
Run Code Online (Sandbox Code Playgroud)


tom*_*m10 7

您可以构造一个切片对象来完成这项工作:

def choose_from_axis(a, axis, start, stop):
    s = [slice(None) for i in range(a.ndim)]
    s[axis] = slice(start, stop)
    return a[s]
Run Code Online (Sandbox Code Playgroud)

例如,以下两者给出相同的结果:

x[:,1:2,:]
choose_from_axis(x, 1, 1, 2)

# [[[ 3  4  5]]
#  [[12 13 14]]
#  [[21 22 23]]]
Run Code Online (Sandbox Code Playgroud)

就像问题中的例子一样:

a = np.random.random((10, 10, 10, 10, 10, 10, 10))
a0 = a[:, :, 7:9, ...]
a1 = choose_from_axis(a, 2, 7, 9)

print np.all(a0==a1)   # True
Run Code Online (Sandbox Code Playgroud)