Коротко
np.sort(a)возвращает новый отсортированный массив; методa.sort()сортирует на месте и возвращаетNone.descending=True(с NumPy 2.5) — по убыванию. В старом коде для этого писалиnp.sort(a)[::-1].np.argsort(a)— индексы, которые упорядочили быa. С ними сортируют связанные массивы и строки таблицы.- В многомерном массиве по умолчанию сортируется каждая строка (
axis=-1);axis=None— весь массив как одномерный. - Несколько ключей —
np.lexsort: главный ключ передаётся последним.
Синтаксис
np.sort(a, axis=-1, kind=None, descending=False)
a.sort(axis=-1) # на месте
np.argsort(a, axis=-1, descending=False)
table[table[:, k].argsort()] # строки по столбцу k
np.lexsort((второстепенный, главный))Параметры
ПараметрЧто делаетПо умолчанию
axisось сортировки; None — вытянуть в одну строку-1descendingпо убыванию (новое в 2.5)FalsestableTrue — равные элементы сохраняют исходный порядокNonekindстарый способ выбрать алгоритм: 'quicksort', 'stable'…; нельзя вместе с stable/descendingNoneПримеры
prices = np.array([480, 120, 310, 90, 250])
names = np.array(["чайник", "кружка", "тостер", "ложка", "миска"])print(np.sort(prices)) # новый массив
np.sort(prices, descending=True) # по убыванию (NumPy 2.5)Вывод
[ 90 120 250 310 480] array([480, 310, 250, 120, 90])
В браузере не запускается: пример падает — TypeError: sort() got an unexpected keyword argument 'descending'. Скопируйте код и выполните у себя.
order = np.argsort(prices) # индексы в порядке возрастания цены
print(order)
names[order] # упорядочить другой массив так жеВывод
[3 1 4 2 0] array(['ложка', 'кружка', 'миска', 'тостер', 'чайник'], dtype='<U6')
m = np.array([[3, 8, 2],
[9, 1, 5]])
print(np.sort(m)) # каждая строка (axis=-1)
np.sort(m, axis=0) # каждый столбецВывод
[[2 3 8]
[1 5 9]]
array([[3, 1, 2],
[9, 8, 5]])table = np.array([[3, 250],
[1, 480],
[2, 120]]) # столбцы: id, цена
table[table[:, 1].argsort()] # строки по второму столбцуВывод
array([[ 2, 120],
[ 3, 250],
[ 1, 480]])city = np.array(["Тула", "Омск", "Тула", "Омск"])
score = np.array([7, 9, 5, 9])
idx = np.lexsort((score, city)) # главный ключ — ПОСЛЕДНИЙ
city[idx], score[idx]Вывод
(array(['Омск', 'Омск', 'Тула', 'Тула'], dtype='<U4'), array([9, 9, 5, 7]))
Сначала по городу, при равном городе — по баллам.
Подводные камни
a.sort() возвращает None
result = a.sort() — частая ошибка: массив отсортирован на месте, а в result — None. Нужен новый массив — np.sort(a).
copy = prices.copy()
result = copy.sort() # метод сортирует на месте…
print(result) # …и возвращает None
copyВывод
None array([ 90, 120, 250, 310, 480])
Сортировка по убыванию в старом коде
Разворот [::-1] по-прежнему работает, но у равных элементов меняет порядок на обратный.
np.sort(prices)[::-1] # старый способ «по убыванию»Вывод
array([480, 310, 250, 120, 90])