2015-04-13 4 views
1

Для 1d массива индексирования с результатом argsort на этом массиве вы получаете отсортированный массив.Индексирование номеров с помощью argsort

ar = numpy.random.random(4) 
s = numpy.argsort(ar) 
ar[s].shape 
(4,) 

Но для 3d я получаю:

ar = numpy.random.random((2,3,2)) 
s = numpy.argsort(ar) 
ar[s].shape 
(2, 3, 2, 3, 2) 

Как я могу получить такое же поведение для 3d массива как для 1d? Спасибо!

ответ

3

numpy.argsort сортирует многомерный массив вдоль своей последней оси, если не указано иное. Ваш s.shape - это то же самое, что и ar.shape, но тот факт, что вы даже можете использовать ar[s] без получения IndexErrors, просто потому, что вы выбрали красивую форму для начала.

Прежде всего, вам нужно подумать о том, что вы действительно хотите отсортировать. Скажем, у вас есть:

[[8, 7], 
[6, 5], 
[4, 3]] 

Что вы хотите купить? Слева направо:

[[7, 8], 
[5, 6], 
[3, 4]] 

или сверху вниз:

[[4, 3], 
[6, 5], 
[8, 7]] 

или полностью:

[[3, 4], 
[5, 6], 
[7, 8]] 

Последний один, вероятно, самый простой выравниваться, а затем изменить форму.

arf = ar.flatten() 
s = numpy.argsort(arf) 
arf[s].reshape(ar.shape) 

Первый один немного сложнее:

s = numpy.argsort(ar) 
numpy.array([[ar2[s2] for ar2, s2 in zip(ar1, s1)] for ar1, s1 in zip(ar, s)]) 

Последняя домашнее задание.

Смежные вопросы