如何根据另一个2d numpy数组给出的索引对2d numpy数组的行进行排序

时间:2016-01-10 00:24:09

标签: python arrays numpy

示例:

arr = np.array([[.5, .25, .19, .05, .01],[.25, .5, .19, .05, .01],[.5, .25, .19, .05, .01]])
print(arr)
[[ 0.5   0.25  0.19  0.05  0.01]
 [ 0.25  0.5   0.19  0.05  0.01]
 [ 0.5   0.25  0.19  0.05  0.01]]

idxs = np.argsort(arr)
print(idxs)
[[4 3 2 1 0]
 [4 3 2 0 1]
 [4 3 2 1 0]]

如何使用idxs索引arr?我想做arr[idxs]之类的事情,但这不起作用。

2 个答案:

答案 0 :(得分:2)

这不是最漂亮的,但我觉得像

>>> arr[np.arange(len(arr))[:,None], idxs]
array([[ 0.01,  0.05,  0.19,  0.25,  0.5 ],
       [ 0.01,  0.05,  0.19,  0.25,  0.5 ],
       [ 0.01,  0.05,  0.19,  0.25,  0.5 ]])

应该有效。第一个术语给出了我们想要的x坐标(使用最后一个单例轴上的广播):

>>> np.arange(len(arr))[:,None]
array([[0],
       [1],
       [2]])

idxs提供y坐标。请注意,如果我们使用unravel_index,则要使用的x坐标始终为0:

>>> np.unravel_index(idxs, arr.shape)[0]
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

答案 1 :(得分:1)

这样的事情怎么样:

我更改了变量以使示例更清晰,但您基本上需要通过两个2D数组进行索引。

In [102]: a = np.array([[1,2,3], [4,5,6]])

In [103]: b = np.array([[0,2,1], [2,1,0]])

In [104]: temp = np.repeat(np.arange(a.shape[0]), a.shape[1]).reshape(a.shape).T 

          # temp is just [[0,1], [0,1], [0,1]]
          # probably can be done more elegantly

In [105]: a[temp, b.T].T
Out[105]: 
array([[1, 3, 2],
       [6, 5, 4]])