Странный / Неправильный выход np.argsort () - PullRequest
0 голосов
/ 25 декабря 2018

Я работал с numpy и argsort, но столкнулся с странным (?) поведением argsort:

>>> array = [[0, 1, 2, 3, 4, 5], 
             [444, 4, 8, 3, 1, 10], 
             [2, 5, 8, 999, 1, 4]]
>>> np.argsort(array, axis=0)

array([[0, 0, 0, 0, 1, 2],
       [2, 1, 1, 1, 2, 0],
       [1, 2, 2, 2, 0, 1]], dtype=int64)

Первые 4 значения каждого списка мне довольно понятны -argsort делает свою работу правильно.Но последние 2 значения довольно запутанные, так как это своего рода неправильная сортировка значений.
Не должно ли вывод argsort быть:

array([[0, 0, 0, 0, 2, 1],
       [2, 1, 1, 1, 0, 2],
       [1, 2, 2, 2, 1, 0]], dtype=int64)

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Я думаю, что проблема в том, что вы думаете, argsort выводит.Давайте сосредоточимся на более простом одномерном примере:

 arr = np.array([5, 10, 4])

Результатом np.argsort будут индексы из исходного массива для сортировки элементов:

[2, 0, 1]

Давайте посмотримпо фактическим отсортированным значениям понять, почему:

[
     4,  # at index 2 in the original array
     5,  # at index 0 in the original array
    10,  # at index 1 in the original array
]

Кажется, что вы представляете себе обратную операцию, где argsort скажет вам, к какому индексу в выходных данных будет перемещаться каждый элемент.Вы можете получить эти индексы, применив argsort к результату argsort.

0 голосов
/ 25 декабря 2018

Вывод правильный, дело в том, что np.argsort с axis = 0 фактически сравнивает каждый элемент элементов первой оси '.Таким образом, для массива

array = [[0, 1, 2, 3, 4, 5], 
...      [444, 4, 8, 3, 1, 10], 
...      [2, 5, 8, 999, 1, 4]]

axis = 0 сравниваются элементы, (0, 444, 2), (1,4,8), (2,8,8), (3,3,999), (4,1,1), (5,10,4), так что он дает массив индексов в виде:

np.argsort(array, axis=0)
array([[0, 0, 0, 0, 1, 2],
       [2, 1, 1, 1, 2, 0],
       [1, 2, 2, 2, 0, 1]])

Итак, для вашего вопроса последние 2 значения получены из элементов(4,1,1), которые дают значение индекса массива как (1,2,0), а для (5,10,4) это дает (2,0,1).

См. Это: np.argsort

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...