Представьте себе, что вам нужно найти книгу на вашей книжной полке. Какую ситуацию вы бы предпочли: 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 и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.