Нашли ошибку?
среднийNumPy 2.5.3

Сортировка

Упорядочить массив, узнать порядок индексов и отсортировать строки таблицы по столбцу.

Нужно знать:Fancy-индексацияОси: axis и keepdims

Содержание статьи

Коротко

  • 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 — вытянуть в одну строку-1
descendingпо убыванию (новое в 2.5)False
stableTrue — равные элементы сохраняют исходный порядокNone
kindстарый способ выбрать алгоритм: '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'. Скопируйте код и выполните у себя.

argsort: упорядочить связанный массив
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]])
Несколько ключей: lexsort
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).

Метод sort
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])