Кто в пятёрке лучших? Какие значения встречаются в данных и сколько раз каждое? Для рейтингов, топов и подсчёта частот нужны сортировка и поиск уникальных значений — о них этот урок.
Отсортировать: np.sort
np.sort(a) возвращает новый отсортированный массив, по возрастанию. Чтобы получить убывание, результат
разворачивают срезом [::-1]:
import numpy as np
prices = np.array([320, 150, 890, 45, 610, 210])
print(np.sort(prices))
print(np.sort(prices)[::-1])
print(prices) # исходный порядок сохранился[ 45 150 210 320 610 890] [890 610 320 210 150 45] [320 150 890 45 610 210]
У массива есть и метод sort(), но он работает иначе: сортирует сам массив на месте и ничего не
возвращает.
nums = np.array([3, 1, 2])
result = nums.sort()
print(result)
print(nums)None [1 2 3]
Сохраните в top3 три самые большие суммы из checks, от большей к меньшей. Сам checks не меняйте.
np.sort(checks) — по возрастанию; развернуть — [::-1].[:3].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
checks = np.array([1450, 380, 2990, 760, 2210, 540, 3120, 890])
top3 = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
checks = np.array([1450, 380, 2990, 760, 2210, 540, 3120, 890])
top3 = np.sort(checks)[::-1][:3]Порядок индексов: np.argsort
Часто сортировать нужно не сами числа, а то, что с ними связано: имена студентов по их баллам. Для этого
есть np.argsort — он возвращает не значения, а индексы в том порядке, в каком значения шли бы после
сортировки:
points = np.array([78, 92, 85, 64, 88])
print(np.argsort(points))
print(points[np.argsort(points)])[3 0 2 4 1] [64 78 85 88 92]
Массив индексов можно подставить в квадратные скобки — получится массив элементов в этом порядке. Так один и тот же порядок применяется к любому массиву той же длины:
names = np.array(["Анна", "Иван", "Мария", "Олег", "Елена"])
order = np.argsort(points)[::-1] # от большего балла к меньшему
print(order)
print(names[order])[1 4 2 0 3] ['Иван' 'Елена' 'Мария' 'Анна' 'Олег']
names[order] — выборка по массиву индексов: элементы берутся в том порядке, в каком перечислены индексы.
Как и выборка по маске, это копия.
В sellers — имена продавцов, в revenue — их выручка за месяц. Сохраните в ranking имена продавцов от
самой большой выручки к самой маленькой.
np.argsort(revenue) — индексы от меньшей выручки к большей; разверните [::-1].sellers[...].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
sellers = np.array(["Пётр", "Юлия", "Максим", "Светлана", "Роман"])
revenue = np.array([410000, 530000, 290000, 610000, 380000])
ranking = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
sellers = np.array(["Пётр", "Юлия", "Максим", "Светлана", "Роман"])
revenue = np.array([410000, 530000, 290000, 610000, 380000])
ranking = sellers[np.argsort(revenue)[::-1]]Что получится: np.argsort(np.array([30, 10, 20]))?
argsort возвращает индексы, а не значения.Уникальные значения: np.unique
np.unique(a) возвращает отсортированный массив разных значений. С return_counts=True — ещё и сколько раз
встречается каждое. Результат тогда — два массива, их удобно сразу разложить по двум именам:
marks_demo = np.array([5, 4, 4, 3, 5, 5, 2, 4, 3, 5, 4, 4])
print(np.unique(marks_demo))
values_demo, counts_demo = np.unique(marks_demo, return_counts=True)
print(values_demo)
print(counts_demo)[2 3 4 5] [2 3 4 5] [1 2 5 4]
В marks — оценки за контрольную. Сохраните в values разные оценки по возрастанию, в counts — сколько раз
встречается каждая, а в most_common — самую частую оценку.
values, counts = np.unique(marks, return_counts=True).counts наибольшее: values[counts.argmax()].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
marks = np.array([4, 3, 5, 4, 4, 2, 5, 3, 4, 3, 3, 5, 3, 4, 3, 3])
values = ...
counts = ...
most_common = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
marks = np.array([4, 3, 5, 4, 4, 2, 5, 3, 4, 3, 3, 5, 3, 4, 3, 3])
values, counts = np.unique(marks, return_counts=True)
most_common = values[counts.argmax()]Итоги
np.sort(a)— новый отсортированный массив;[::-1]— по убыванию.a.sort()сортирует самaи возвращаетNone.np.argsort(a)— индексы в порядке сортировки;b[np.argsort(a)]упорядочиваетbпо значениямa.a[массив_индексов]— элементы в указанном порядке (копия).np.unique(a, return_counts=True)— разные значения и сколько раз каждое встречается.