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

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

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

Что возвращают sort и argsort

np.sort(a) возвращает отсортированную копию массива. np.argsort(a) возвращает индексы, по которым элементы идут в порядке сортировки: их можно применить и к связанному массиву.

import numpy as np
a = np.array([30, 10, 20])
order = np.argsort(a)
print(np.sort(a).tolist())
print(order.tolist())
print(a[order].tolist())
print(np.sort(a)[::-1].tolist())
print(a.tolist())

Результат:

[10, 20, 30]
[1, 2, 0]
[10, 20, 30]
[30, 20, 10]
[30, 10, 20]

Последняя строка показывает, что исходный массив не изменился. Метод a.sort(), напротив, сортирует массив на месте и возвращает None. Обратный срез выше подходит для одномерного примера; для матриц учитывайте выбранную ось.

В прошлом уроке мы разбирали, как объединять массивы через concatenate и stack, и постоянно проверяли результат через .shape — это был главный способ убедиться, что склейка прошла корректно. Сейчас переходим к сортировке, и параметр axis здесь работает по той же логике: он указывает, вдоль какой оси идёт операция.

np.sort: получение отсортированной копии по оси

Функция np.sort возвращает новый массив с теми же элементами, расположенными в порядке возрастания. Исходный массив при этом не трогается — это важно запомнить сразу, потому что в numpy существует и метод .sort(), который сортирует массив «на месте». Здесь речь только о функции-копии.

Для одномерного массива всё просто:

import numpy as np

arr = np.array([30, 10, 40, 20])
sorted_arr = np.sort(arr)
print(sorted_arr)  # [10 20 30 40]
print(arr)         # [30 10 40 20] — не изменился

Shape результата совпадает с shape входа: был (4,), стал (4,).

С двумерным массивом поведение определяется параметром axis.

M = np.array([[3, 1, 4],
              [1, 5, 2]])

axis=0 — каждый столбец сортируется независимо, элементы упорядочиваются сверху вниз:

print(np.sort(M, axis=0))
# [[1 1 2]
#  [3 5 4]]

Столбец 0: [3, 1] → [1, 3]. Столбец 1: [1, 5] → [1, 5]. Столбец 2: [4, 2] → [2, 4]. Строки при этом как единицы не сохраняются — элементы из одной строки могут «разойтись» по разным позициям.

axis=1 — каждая строка сортируется независимо, элементы упорядочиваются слева направо:

print(np.sort(M, axis=1))
# [[1 3 4]
#  [1 2 5]]

Строка 0: [3, 1, 4] → [1, 3, 4]. Строка 1: [1, 5, 2] → [1, 2, 5].

В обоих случаях shape результата остаётся (2, 3) — таким же, как у исходного M. np.sort никогда не меняет форму массива при использовании числового axis.

Практическое правило выбора оси: определите, какие последовательности должны быть отсортированы. Если нужно упорядочить элементы внутри каждой строки — используйте axis=1. Если нужно упорядочить элементы внутри каждого столбца — используйте axis=0. Нужная ось зависит от структуры ваших данных и задачи.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.