Шаг 44.
Однострочники Python. Наука о данных. Когда использовать в NumPy функцию sort(), а когда - argsort(). Общее описание

    На этом шаге мы сравним результвты использования этих функций.

    Сортировка удобна и даже необходима во множестве ситуаций. Скажем, вы хотите найти на полке какую-то книгу. Правда же, искать ее будет намного проще, если книги на полке отсортированы по алфавиту?

Общее описание

    Сортировка - центральный элемент более сложных приложений, таких как коммерческие расчеты, планирование процессов в операционных системах (очереди по приоритету) и поисковые алгоритмы. К счастью, библиотека NumPy предоставляет самые разнообразные алгоритмы сортировки. По умолчанию используется популярный алгоритм быстрой сортировки. Позже вы узнаете, как реализовать алгоритм быстрой сортировки самостоятельно. Однако в следующем однострочнике мы будем придерживаться более высокоуровневого подхода и рассматривать функцию сортировки как "черный ящик", на входе которого - массив NumPy, а на выходе - все он же, но уже отсортированный.

    На рисунке 1 приведен алгоритм преобразования неотсортированного массива в отсортированный - цель функции sort() NumPy.


Рис.1. Различие между функциями sort() и argsort()

    Но зачастую бывает необходимо получить массив индексов, преобразующий неупорядоченный массив в отсортированный. Например, пусть индекс элемента 1 неупорядоченного массива - 7. Поскольку элемент 1 - первый элемент отсортированного массива, его индекс 7 будет первым элементом индексов отсортированного массива. Именно для этого и служит функция argsort(): она создает новый массив индексов исходного массива после сортировки (см. пример на рисунке 1). Попросту говоря, этими индексами можно воспользоваться для сортировки элементов исходного массива. С помощью данного массива можно восстановить как отсортированный, так и исходный массив.

    Пример 3.21 демонстрирует использование в NumPy функций sort() и argsort().


Пример 3.21. Функции sort() и argsort() в NumPy
import numpy as np

a = np.array([10, 6, 8, 2, 5, 4, 9, 1])
print(np.sort(a))
# [ 1 2 4 5 6 8 9 10]

print(np.argsort(a))
# [7 3 5 4 1 2 6 0]

    Мы создали неупорядоченный массив a, отсортировали его с помощью вызова np.sort(a), а также получили исходные индексы в новом отсортированном порядке с помощью вызова np.argsort(a). Функция sort() библиотеки NumPy отличается от функции sorted() языка Python тем, что может сортировать и многомерные массивы!

    На рисунке 2 приведены два способа сортировки двумерного массива.


Рис.2. Сортировка по разным осям координат

    У данного массива - две оси координат: ось 0 (строки) и ось 1 (столбцы). Сортировать можно либо по оси 0 (так называемая вертикальная сортировка), либо по оси 1 (так называемая горизонтальная сортировка). Вообще говоря, ключевое слово axis задает направление, по которому происходит операция NumPy. Пример 3.22 демонстрирует технические подробности.


Пример 3.22. Сортировка по различным осям
import numpy as np

a = np.array([[1, 6, 2],
              [5, 1, 1],
              [8, 0, 1]])

print(np.sort(a, axis=0))
# [[1 0 1]
#  [5 1 1]
#  [8 6 2]]

print(np.sort(a, axis=1))
# [[1 2 6]
#  [1 1 5]
#  [0 1 8]]

    Необязательный аргумент axis служит для сортировки массива NumPy по конкретной оси. Сначала мы отсортировали по столбцам, начиная с минимального значения. А затем - по строкам. В этом главное преимущество функции sort() библиотеки NumPy по сравнению со встроенной функцией sorted() языка Python.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг