Рубрики
Без рубрики

Окончательное введение в сортировку в Numpy

Функции SORT () и ARGSORT () NUMPY находятся на 100% на основе QuickSort (как по умолчанию). Узнайте, как использовать аргумент оси тоже!

Автор оригинала: Chris.

Представьте себе, что вам нужно найти книгу на вашей книжной полке. Какую ситуацию вы бы предпочли: a) Ваша книжная полка содержит все ваши книги без определенного порядка, или b) Ваша книжная полка содержит все книги в алфавитном порядке отсортированы по названию.

Конечно, вариант B) сэкономит вам много времени – особенно если вы получаете доступ к вашей книжной полке несколько раз. Эта статья покажет вам, как использовать сортировку в одной строке Python, используя Numpy Library. Статья удаленно основана на книжных главах из моей книги «Coffe Break Numpy» и моя предстоящая книга «Python One-Liners». 😊.

Основы

Сортировка находится в основе более передовых приложений, таких как коммерческие вычисления, обход графов или алгоритмы поиска. К счастью, Numpy предоставляет различные алгоритмы поиска – алгоритм поиска по умолчанию, являющийся популярным алгоритмом «Quicksort». Однако для этого одноклассника мы предпринимаем подход к более высоким уровню, просматривая функцию сортировки как «черный ящик», где мы можем поставить в Numpy Array и получить сортировку Numpy Array.

На рисунке показано, как алгоритм преобразует несоответствующий массив [10, 6, 8, 2, 5, 4, 9, 1] в отсортированный массив [1, 2, 4, 5, 6, 8, 9, 10]. Это цель функции numpy sort ().

Но часто не только важно сортировать сам массив, но и получить массив индексов, которые будут преобразовывать несортированный массив в отсортированный массив. Например, элемент массива «1» от несортированного массива имеет индекс «7». Поскольку элемент массива «1» – первый элемент отсортированного массива, его индекс «7» является первым элементом отсортированных индексов. Это цель функции argsort () numpy.

Этот маленький фрагмент кода демонстрирует, как вы будете использовать 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]

Вы можете спросить: как функция Numpy Sort () отличается от сортировки () Python? Ответ прост: вы можете использовать Numpy, чтобы сортировать многомерные массивы тоже!

На рисунке показаны два способа использования функции сортировки для сортировки двумерного массива. Массив, который будет отсортирован, имеет две оси: ось 0 (строки) и ось 1 (столбцы). Теперь вы можете отсортировать по оси 0 (вертикально отсортировано) или вдоль оси 1 (горизонтально отсортировано). В целом, ключевое слово AXIS определяет направление, вдоль которого вы выполняете OUMPY-операцию. Вот фрагмент кода, который показывает технически, как это сделать:

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]]
"""

Примером показывает, что дополнительный аргумент оси помогает вам сортировать множество массива вдоль фиксированного направления. Это главная сила функции numpy’s sorth () по сравнению с встроенной сортированной () функцией Python.

Код

One-LiLER решает следующую проблему: «Найдите имена трех лучших студентов с самыми высокими самыми.» Обратите внимание, что просто сортировка массива баллов SAT не решает проблему, потому что проблема просит названия студентов. Посмотрите на данные сначала, а затем попробуйте найти одноинальный раствор самостоятельно.

## Dependencies
import numpy as np


## Data: SAT scores for different students
sat_scores = np.array([1100, 1256, 1543, 1043, 989, 1412, 1343])
students = np.array(["John", "Bob", "Alice", "Joe", "Jane", "Frank", "Carl"])


## One-liner
top_3 = students[np.argsort(sat_scores)][:3:-1]


## Result
print(top_3)

Какая вывод этого кода фрагмент?

Результат

Первоначально код определяет данные, состоящие из оценок SAT студентов как одномерный массив данных, а также имена этих студентов. Например, студент “Джон” достиг сетевой оценки “1100”, а «Фрэнк» достиг сетевой оценки «1343».

Вопрос в том, чтобы найти имена трех самых успешных студентов. Одноклассник достигает этой цели – не просто сортировка баллов SAT – но путем запуска функции argsort (). Напомним, что функция argsort () возвращает массив индексов, такой, что соответствующие элементы массива данных будут отсортированы.

Вот вывод функции argsort на оценках SAT:

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

Почему индекс «4» на первом положении вывода? Потому что студент «Джейн» имеет самую низкую оценку SAT с 989 очками. Обратите внимание, что как сортировка (), так и argsort () сортируют по возрастанию от самых низких до наивысших значений.

У вас есть отсортированные индексы, но что сейчас? Идея состоит в том, чтобы получить имена соответствующих студентов. Теперь это может быть достигнуто с помощью простой индексации на массиве имени студента:

print(students[np.argsort(sat_scores)])
# ['Jane' 'Joe' 'John' 'Bob' 'Carl' 'Frank' 'Alice']

Вы уже знаете, что «Джейн» имеет самую низкую оценку SAT, а «Алиса» имеет самую высокую оценку SAT. Единственное, что осталось – перегрузить этот список (от наивысшего до самого низкого) и извлечь трех лучших студентов, используя простые нарезки:

## One-liner
top_3 = students[np.argsort(sat_scores)][:3:-1]


## Result
print(top_3)
# ['Alice' 'Frank' 'Carl']

Алиса, Фрэнк и Карл – ученики с самыми высокими оценками SAT 1543, 1412 и 1343, соответственно.

Что делать дальше?

Чтобы помочь вам стать лучшим кодом (и преодолеть свой слабее себя), я создал свой адрес электронной почты для постоянного улучшения в Python. Мои книги «Кофе-брейк Python» и «The Coffe Break Numpy» основаны на этой философии небольших непрерывных улучшений (Kaizen) с использованием учебного подхода на основе головоломки. Это весело!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.