Нашли ошибку?
Скачать чистый
урок 4 из 5≈ 15 минупражнения: 0 из 3

Сортировка и уникальные

Отсортировать значения, получить порядок индексов argsort — и с его помощью расставить по местам имена; посчитать, какие значения встречаются и сколько раз.

Python запустится при первом выполнении

Кто в пятёрке лучших? Какие значения встречаются в данных и сколько раз каждое? Для рейтингов, топов и подсчёта частот нужны сортировка и поиск уникальных значений — о них этот урок.

Отсортировать: 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(), но он работает иначе: сортирует сам массив на месте и ничего не возвращает.

[ ]Метод sort() меняет массив
nums = np.array([3, 1, 2])
result = nums.sort()
print(result)
print(nums)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
None
[1 2 3]
[ ]Упражнение 1Три самые дорогие покупки решено

Сохраните в top3 три самые большие суммы из checks, от большей к меньшей. Сам checks не меняйте.

checks = np.array([1450, 380, 2990, 760, 2210, 540, 3120, 890])
top3 = ...

Порядок индексов: np.argsort

Часто сортировать нужно не сами числа, а то, что с ними связано: имена студентов по их баллам. Для этого есть np.argsort — он возвращает не значения, а индексы в том порядке, в каком значения шли бы после сортировки:

[ ]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] — выборка по массиву индексов: элементы берутся в том порядке, в каком перечислены индексы. Как и выборка по маске, это копия.

[ ]Упражнение 2Рейтинг продавцов решено

В sellers — имена продавцов, в revenue — их выручка за месяц. Сохраните в ranking имена продавцов от самой большой выручки к самой маленькой.

sellers = np.array(["Пётр", "Юлия", "Максим", "Светлана", "Роман"])
revenue = np.array([410000, 530000, 290000, 610000, 380000])
ranking = ...

Вопрос

Что получится: np.argsort(np.array([30, 10, 20]))?

Уникальные значения: 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]
[ ]Упражнение 3Распределение оценок решено

В marks — оценки за контрольную. Сохраните в 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 = ...
most_common = ...

Итоги

  • np.sort(a) — новый отсортированный массив; [::-1] — по убыванию.
  • a.sort() сортирует сам a и возвращает None.
  • np.argsort(a) — индексы в порядке сортировки; b[np.argsort(a)] упорядочивает b по значениям a.
  • a[массив_индексов] — элементы в указанном порядке (копия).
  • np.unique(a, return_counts=True) — разные значения и сколько раз каждое встречается.

Подробнее в справочнике

Нашли ошибку?