使用一个numpy数组作为另一个数组的第二个暗淡的索引?

avo*_*ado 6 python indexing numpy

例如,我有两个numpy数组,

A = np.array(
  [[0,1], 
   [2,3], 
   [4,5]])
B = np.array(
  [[1],
   [0],
   [1]], dtype='int')
Run Code Online (Sandbox Code Playgroud)

并且我想从中的每一行提取一个元素A,并且该元素被索引B,所以我想要以下结果:

C = np.array(
  [[1],
   [2],
   [5]])
Run Code Online (Sandbox Code Playgroud)

我试过了A[:, B.ravel()],但是会播放B,不是我想要的。还调查了一下np.take,似乎不是解决我的问题的正确方法。

不过,我可以用np.choose通过转A

np.choose(B.ravel(), A.T)
Run Code Online (Sandbox Code Playgroud)

但是还有其他更好的解决方案吗?

Div*_*kar 6

您可以使用NumPy's purely integer array indexing-

A[np.arange(A.shape[0]),B.ravel()]
Run Code Online (Sandbox Code Playgroud)

样品运行-

In [57]: A
Out[57]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [58]: B
Out[58]: 
array([[1],
       [0],
       [1]])

In [59]: A[np.arange(A.shape[0]),B.ravel()]
Out[59]: array([1, 2, 5])
Run Code Online (Sandbox Code Playgroud)

请注意,如果B1D数组或此类列索引的列表,则可以直接使用来跳过展平操作.ravel()

样品运行-

In [186]: A
Out[186]: 
array([[0, 1],
       [2, 3],
       [4, 5]])

In [187]: B
Out[187]: [1, 0, 1]

In [188]: A[np.arange(A.shape[0]),B]
Out[188]: array([1, 2, 5])
Run Code Online (Sandbox Code Playgroud)