Numpy - 索引多维数组的一维

Mus*_*üve 3 arrays indexing numpy python-3.x

我有一个像这样的 numpy 数组,形状如下(6, 2, 4)

x = np.array([[[0, 3, 2, 0],
               [1, 3, 1, 1]],

              [[3, 2, 3, 3],
               [0, 3, 2, 0]],

              [[1, 0, 3, 1],
               [3, 2, 3, 3]],

              [[0, 3, 2, 0],
               [1, 3, 2, 2]],

              [[3, 0, 3, 1],
               [1, 0, 1, 1]],

              [[1, 3, 1, 1],
               [3, 1, 3, 3]]])
Run Code Online (Sandbox Code Playgroud)

我有choices这样的数组:

choices = np.array([[1, 1, 1, 1],
                    [0, 1, 1, 0],
                    [1, 1, 1, 1],
                    [1, 0, 0, 0],
                    [1, 0, 1, 1],
                    [0, 0, 0, 1]])
Run Code Online (Sandbox Code Playgroud)

如何使用choices数组仅索引大小为 2 的中间维度,并(6, 4)以最有效的方式获得形状为新的 numpy 数组?

结果是这样的:

[[1 3 1 1]
 [3 3 2 3]
 [3 2 3 3]
 [1 3 2 0]
 [1 0 1 1]
 [1 3 1 3]]
Run Code Online (Sandbox Code Playgroud)

我尝试这样做,x[:, choices, :]但这并没有返回我想要的。我也尝试过,x.take(choices, axis=1)但没有成功。

Div*_*kar 7

用于np.take_along_axis沿第二个轴进行索引 -

In [16]: np.take_along_axis(x,choices[:,None],axis=1)[:,0]
Out[16]: 
array([[1, 3, 1, 1],
       [3, 3, 2, 3],
       [3, 2, 3, 3],
       [1, 3, 2, 0],
       [1, 0, 1, 1],
       [1, 3, 1, 3]])
Run Code Online (Sandbox Code Playgroud)

或者使用显式integer-array索引 -

In [22]: m,n = choices.shape

In [23]: x[np.arange(m)[:,None],choices,np.arange(n)]
Out[23]: 
array([[1, 3, 1, 1],
       [3, 3, 2, 3],
       [3, 2, 3, 3],
       [1, 3, 2, 0],
       [1, 0, 1, 1],
       [1, 3, 1, 3]])
Run Code Online (Sandbox Code Playgroud)