2016-01-10 4 views
0

Пример:Как отсортировать строки в 2d Numpy массива на основе индексов, данные другим 2d массива 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

Это не самый красивый, но я думаю, что-то вроде

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

должен работать. Первый член дает е координаты мы хотим (с помощью вещания в течение последней одноплодной оси):

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

с idxs обеспечивая у координаты. Обратите внимание, что если бы мы использовали unravel_index, х координаты, чтобы использовать всегда был бы 0 вместо:

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

Это, конечно, лучше, чем то, что я придумал. – Akavall

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]]) 
Смежные вопросы