WedX - журнал о программировании и компьютерных науках

Сортировка с использованием argsort в python

Я пытаюсь отсортировать массив:

import numpy as np

arr = [5,3,7,2,6,34,46,344,545,32,5,22]
print "unsorted"
print arr

np.argsort(arr)

print "sorted"
print arr

Но вывод:

unsorted
[5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]
sorted
[5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

Массив вообще не меняется

06.11.2013

  • Такие вещи можно найти за 1 минуту в документах: docs.scipy. org/doc/numpy/reference/generated/numpy.argsort.html 1. Возвращает индексы отсортированных элементов. 2. На месте не делает, а возвращает новый массив. 06.11.2013
  • Используйте arr.sort() для сортировки на месте. 06.11.2013

Ответы:


1

Здесь есть две проблемы; во-первых, np.argsort возвращает массив индексов, которые сортируют исходный массив, во-вторых, он не изменяет исходный массив, а просто дает вам другой. Этот интерактивный сеанс должен помочь объяснить:

In [59]: arr = [5,3,7,2,6,34,46,344,545,32,5,22]

In [60]: np.argsort(arr)
Out[60]: array([ 3,  1,  0, 10,  4,  2, 11,  9,  5,  6,  7,  8])

Выше [3, 1, 0, ...] означает, что элемент 3 в исходном списке должен стоять первым (2), затем должен идти элемент 2 (3), затем первым (индекс 0, элемент 5) и так далее. Обратите внимание, что arr по-прежнему не затрагивается:

In [61]: arr
Out[61]: [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

Вам может не понадобиться этот массив индексов, и вам будет проще просто использовать np.sort:

In [62]: np.sort(arr)
Out[62]: array([  2,   3,   5,   5,   6,   7,  22,  32,  34,  46, 344, 545])

Но это по-прежнему оставляет arr в покое:

In [68]: arr
Out[68]: [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]

Если вы хотите сделать это на месте (изменить оригинал), используйте:

In [69]: arr.sort()

In [70]: arr
Out[70]: [2, 3, 5, 5, 6, 7, 22, 32, 34, 46, 344, 545]
06.11.2013
  • Как примечание, np.sort(arr) возвращает копию отсортированного массива, а не сортировку на месте. 06.11.2013
  • @Josh, правда, для этого и предназначен arr.sort(), в конце концов, поскольку np.sort(arr) оставляет arr в покое. 10.11.2013

  • 2

    np.argsort не сортирует список на месте, он возвращает список, полный показателей, которые вы можете использовать для сортировки списка.

    Вы должны присвоить этому возвращаемому списку значение:

    new_arr = np.argsort(arr)
    

    Затем, чтобы отсортировать список с такими индексами, вы можете сделать:

    np.array(arr)[new_arr]
    
    06.11.2013
  • Я думаю, вы имеете в виду indices = np.argsort(arr); arr[indices]. Обратите внимание, что argsort не sort 06.11.2013
  • @askewchan Это просто имя. ОП может называть это как хочет :) 06.11.2013
  • Правда, извините, я имел в виду ваше первое предложение, np.argsort не сортирует список на месте, он возвращает отсортированный список. Он возвращает индексы, которые будут сортировать список. Посмотрите, что возвращает пример OP: array([ 3, 1, 0, 10, 4, 2, 11, 9, 5, 6, 7, 8]), который я бы не назвал отсортированным. 06.11.2013
  • @askewchan Спасибо. Я никогда полностью не работал с numpy, поэтому я отредактирую свой ответ. 06.11.2013

  • 3

    Пытаться

    order = np.argsort(arr)
    print np.array(arr)[order]
    

    ответ argsort представляет собой индекс элементов.

    06.11.2013

    4

    Если вы хотите, чтобы ваш массив отсортировался на месте, вам нужно arr.sort():

    In [1]: import numpy as np  
    In [2]: arr = [5,3,7,2,6,34,46,344,545,32,5,22]
    
    In [4]: print arr
    [5, 3, 7, 2, 6, 34, 46, 344, 545, 32, 5, 22]
    
    In [5]: arr.sort()
    In [7]: print arr
    [2, 3, 5, 5, 6, 7, 22, 32, 34, 46, 344, 545]
    
    06.11.2013
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]