Функция для возврата списка кортежей, соответствующих индексам ВСЕХ элементов отсортированного ndarray?

Я знаю о numpy.argsort(), но он возвращает индексы элементов в массиве, которые будут отсортированы по определенной оси.

Мне нужно отсортировать все значения в N-мерном массиве и в результате получить линейный список кортежей.

Как это:

>>> import numpy
>>> A = numpy.array([[7, 8], [9, 5]])
>>> numpy.magic(A)
[(1, 0), (0, 1), (0, 0), (1, 1)]

P.S. Я даже не понимаю, что мне пытается сказать вывод argsort для этого массива.


person Unknown artist    schedule 21.04.2013    source источник


Ответы (1)


np.argsort(A) сортирует каждую строку A отдельно. Например,

In [21]: np.argsort([[6,5,4],[3,2,1]])
Out[21]: 
array([[2, 1, 0],
       [2, 1, 0]])

Вместо этого вы хотите сгладить свой массив в одномерный массив значений, а затем отсортировать его. Это можно сделать, установив для параметра axis значение None (спасибо @Akavall за указание на это):

In [23]: np.argsort(A, axis=None)
Out[23]: array([3, 0, 1, 2])

Затем используйте np.unravel_index. чтобы восстановить связанный индекс в A.


In [14]: import numpy as np

In [15]: A = np.array([[7, 8], [9, 5]])   

In [4]: np.column_stack(np.unravel_index(np.argsort(A, axis=None)[::-1], A.shape))
Out[4]: 
array([[1, 0],
       [0, 1],
       [0, 0],
       [1, 1]])

Обратите внимание, что для NumPy версии 1.5.1 или старше np.unravel_index вызывает ошибку ValueError, если в качестве первого аргумента передается массивоподобный объект. В этом случае вы можете использовать понимание списка:

In [17]: [np.unravel_index(p, A.shape) for p in np.argsort(A, axis=None)[::-1]]
Out[17]: [(1, 0), (0, 1), (0, 0), (1, 1)]
person unutbu    schedule 21.04.2013
comment
Вы можете сделать np.argsort(A, axis=None) и пропустить шаг ravel(). - person Akavall; 21.04.2013
comment
@Akavall: Большое спасибо за улучшение. - person unutbu; 21.04.2013
comment
Нет необходимости в понимании списка, np.unravel_index будет принимать массив индексов в качестве первого аргумента, что-то вроде np.vstack(np.unravel_index(np.argsort(A, axis=None)[::-1], A.shape)).T более numpythonic. - person Jaime; 21.04.2013
comment
@Jamie: Спасибо за улучшение! - person unutbu; 21.04.2013