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

时间:2016-06-18 13:54:28

标签: python numpy indexing

例如,我有两个numpy数组,

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

我希望从A的每一行中提取一个元素,并且该元素由B编制索引,因此我希望得到以下结果:

C = np.array(
  [[1],
   [2],
   [5]])

我试过A[:, B.ravel()],但它会广播B,而不是我想要的。同时查看np.take,似乎不是解决我问题的正确方法。

但是,我可以通过转置np.choose

来使用A
np.choose(B.ravel(), A.T)

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

2 个答案:

答案 0 :(得分:5)

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

A[np.arange(A.shape[0]),B.ravel()]

示例运行 -

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])

请注意,如果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])

答案 1 :(得分:0)

C = np.array([A[i][j] for i,j in enumerate(B)])