Сортировка массивов: 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. Нужная ось зависит от структуры ваших данных и задачи.
