На этом шаге мы сравним результвты использования этих функций.
Сортировка удобна и даже необходима во множестве ситуаций. Скажем, вы хотите найти на полке какую-то книгу. Правда же, искать ее будет намного проще,
если книги на полке отсортированы по алфавиту?
Сортировка - центральный элемент более сложных приложений, таких как коммерческие расчеты, планирование процессов в операционных системах (очереди по приоритету) и поисковые алгоритмы. К счастью, библиотека NumPy предоставляет самые разнообразные алгоритмы сортировки. По умолчанию используется популярный алгоритм быстрой сортировки. Позже вы узнаете, как реализовать алгоритм быстрой сортировки самостоятельно. Однако в следующем однострочнике мы будем придерживаться более высокоуровневого подхода и рассматривать функцию сортировки как "черный ящик", на входе которого - массив NumPy, а на выходе - все он же, но уже отсортированный.
На рисунке 1 приведен алгоритм преобразования неотсортированного массива в отсортированный - цель функции sort() NumPy.
Рис.1. Различие между функциями sort() и argsort()
Но зачастую бывает необходимо получить массив индексов, преобразующий неупорядоченный массив в отсортированный. Например, пусть индекс элемента 1 неупорядоченного массива - 7. Поскольку элемент 1 - первый элемент отсортированного массива, его индекс 7 будет первым элементом индексов отсортированного массива. Именно для этого и служит функция argsort(): она создает новый массив индексов исходного массива после сортировки (см. пример на рисунке 1). Попросту говоря, этими индексами можно воспользоваться для сортировки элементов исходного массива. С помощью данного массива можно восстановить как отсортированный, так и исходный массив.
Пример 3.21 демонстрирует использование в NumPy функций sort() и argsort().
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 демонстрирует технические подробности.
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.
На следующем шаге мы закончим изучение этого вопроса.