NumPy: вычисления и устройство массивов

Сортировка массивов: sort и argsort

Содержание курса

Перестановка связанного массива через argsort и fancy indexing

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

Пример: массив scores содержит результаты пяти участников, массив names — их имена. Хочется расставить имена по возрастанию результата.

import numpy as np

scores = np.array([72, 45, 91, 60, 83])
names  = np.array(['Алиса', 'Борис', 'Вера', 'Глеб', 'Дина'])

idx = np.argsort(scores)
print(idx)           # [1 3 0 4 2]

print(scores[idx])   # [45 60 72 83 91]
print(names[idx])    # ['Борис' 'Глеб' 'Алиса' 'Дина' 'Вера']

Что происходит: np.argsort(scores) вычисляет, в каком порядке нужно взять элементы scores, чтобы они шли по возрастанию. Этот порядок записывается в idx. Затем тот же idx применяется к names через fancy indexing — и массив имён переставляется точно в том же порядке.

Оба массива остаются неизменными — мы получаем две новые перестановки. Никаких циклов, никакого ручного отслеживания позиций.

Важные условия, при которых это работает:

  • оба массива одномерные;
  • оба имеют одинаковую длину;
  • idx получен из np.argsort одного из них.

Если эти условия выполнены, arr[idx] и labels[idx] дадут результаты с тем же shape (n,), что и исходные массивы, и их элементы будут попарно соответствовать друг другу.

Эта техника часто встречается, когда нужно ранжировать объекты по одному признаку, сохраняя при этом их идентификаторы или другие атрибуты. Позже, в pandas, аналогичную задачу решает sort_values для DataFrame — но там это происходит под капотом, а здесь вы видите механику явно.