2010-01-06 2 views
0

Это работает очень хорошо в 1 измерении:Выбор индексов для 2d массива в NumPy

# This will sort bar by the order of the values in foo 
(Pdb) bar = np.array([1,2,3]) 
(Pdb) foo = np.array([5,4,6]) 
(Pdb) bar[np.argsort(foo)] 
array([2, 1, 3]) 

Но как это сделать, что в двух измерениях? Argsort работает хорошо, но выбор больше не работает:

(Pdb) foo = np.array([[5,4,6], [9,8,7]]) 
(Pdb) bar = np.array([[1,2,3], [1,2,3]]) 
(Pdb) bar[np.argsort(foo)] 
*** IndexError: index (2) out of range (0<=index<=1) in dimension 0 
(Pdb) 

Я бы ожидать, что это выход:

array([[2, 1, 3], [3, 2, 1]]) 

Любой ключ, как это сделать?

Спасибо! /YGA

Редактировать: take() может показаться правильным, но на самом деле это занимает только элементы из первой строки (супер запутанной).

Вы можете видеть, что если я изменить значение бара:

(Pdb) bar = np.array([["1","2","3"], ["A", "B", "C"]]) 
(Pdb) bar.take(np.argsort(foo)) 
array([['2', '1', '3'], 
     ['3', '2', '1']], 
     dtype='|S1') 
(Pdb) 
+0

'бар [[[0], [1]], np.argsort (Foo)]', кажется, делай, что хочешь. –

+0

@Alok: да, но стратегия, казалось, потерпела неудачу на более сложном примере (я также должен сказать, что считаю ее несколько загадочной). – YGA

+0

@YGA: Расскажите, пожалуйста, какой сложный пример? Я объясню этот метод более подробно позже, если вы захотите. –

ответ

0

bar.take(np.argsort(foo)) произвел свой желаемый результат, так что вы должны смотреть на его documentation, чтобы убедиться, что он на самом деле делает то, что вы думаете, что вы хотите.

Edit:

Попробуйте это: bar.take(np.argsort(foo.ravel()).reshape(foo.shape))

+0

(попытался добавить комментарий, но он был неверно отформатирован, потому что у вас не может быть кода в комментариях. См. Править выше) – YGA

+0

Вы правы - он принимает на основе сплющенных размеров, а 0, 1 и 2 все лежат в первая строка этого массива. Здесь это может сработать ... – kwatford

+0

Очень приятно! Благодаря! – YGA

2

Вы хотите

bar[[[0],[1]], np.argsort(foo)] 

Это потому, что вам нужно два индекса к индексу bar. [[0], [1]] - это правильное вещание. См. this post on numpy-discussion список рассылки за тот же вопрос и ответ.

1

Хороший общее решение (с п строк для сортировки) предлагается at this post, т.е.

bar[np.arange(foo.shape[0])[:,None], np.argsort(foo)] 
Смежные вопросы