Spec-Zone.ru › NumPy 2.0

numpy.lexsort

numpy.lexsort(keys, axis=-1)

Выполнить косвенную устойчивую сортировку с помощью последовательности ключей.

При наличии нескольких ключей сортировки, lexsort возвращает массив целочисленных индексов, описывающих порядок сортировки по нескольким ключам. Последний ключ в последовательности используется для первичного порядка сортировки, связи разрываются по второму ключу и так далее.

Параметры:
keys(k, m, n, …) array-like

Ключи k для сортировки. Последний ключ (например, последняя строка, если keys — это двумерный массив) является первичным ключом сортировки. Каждый элемент keys вдоль нулевой оси должен быть объектом типа array-like одинаковой формы.

axisint, необязательно

Ось, по которой будет осуществляться косвенная сортировка. По умолчанию сортировка происходит по последней оси каждой последовательности. Отдельные срезы вдоль axis сортируются независимо; см. последний пример.

Возвращает:
indices(m, n, …) ndarray целых чисел

Массив индексов, сортирующих ключи вдоль указанной оси.

См. также

argsort

Косвенная сортировка.

ndarray.sort

Сортировка на месте.

sort

Возвращает отсортированную копию массива.

Примеры

Сортировка имён: сначала по фамилии, затем по имени.

>>> surnames =    ('Hertz',    'Galilei', 'Hertz')
>>> first_names = ('Heinrich', 'Galileo', 'Gustav')
>>> ind = np.lexsort((first_names, surnames))
>>> ind
array([1, 2, 0])
>>> [surnames[i] + ", " + first_names[i] for i in ind]
['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich']

Сортировка по двум числовым ключам, сначала по элементам a, затем разрыв связей по элементам b:

>>> a = [1, 5, 1, 4, 3, 4, 4]  # First sequence
>>> b = [9, 4, 0, 4, 0, 2, 1]  # Second sequence
>>> ind = np.lexsort((b, a))  # Sort by `a`, then by `b`
>>> ind
array([2, 0, 4, 6, 5, 3, 1])
>>> [(a[i], b[i]) for i in ind]
[(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]

Сравните с argsort, который бы сортировал каждый ключ независимо.

>>> np.argsort((b, a), kind='stable')
array([[2, 4, 6, 5, 1, 3, 0],
       [0, 2, 4, 3, 5, 6, 1]])

Для лексикографической сортировки с помощью argsort нам потребовался бы структурированный массив.

>>> x = np.array([(ai, bi) for ai, bi in zip(a, b)],
...              dtype = np.dtype([('x', int), ('y', int)]))
>>> np.argsort(x)  # or np.argsort(x, order=('x', 'y'))
array([2, 0, 4, 6, 5, 3, 1])

Нулевая ось keys всегда соответствует последовательности ключей, поэтому двумерные массивы обрабатываются так же, как и другие последовательности ключей.

>>> arr = np.asarray([b, a])
>>> ind2 = np.lexsort(arr)
>>> np.testing.assert_equal(ind2, ind)

Соответственно, параметр axis относится к оси каждого ключа, а не к аргументу keys сам по себе. Например, массив arr рассматривается как последовательность из двух одномерных ключей, поэтому указание axis=0 эквивалентно использованию значения по умолчанию для оси, axis=-1.

>>> np.testing.assert_equal(np.lexsort(arr, axis=0),
...                         np.lexsort(arr, axis=-1))

Для многомерных массивов параметр axis начинает играть роль. Результирующий массив имеет такую же форму, как и каждый ключ, и значения соответствуют ожиданиям, если lexsort выполнялось на соответствующих слайсах ключей независимо. Например,

>>> x = [[1, 2, 3, 4],
...      [4, 3, 2, 1],
...      [2, 1, 4, 3]]
>>> y = [[2, 2, 1, 1],
...      [1, 2, 1, 2],
...      [1, 1, 2, 1]]
>>> np.lexsort((x, y), axis=1)
array([[2, 3, 0, 1],
       [2, 0, 3, 1],
       [1, 0, 3, 2]])

Каждая строка результата соответствует ожиданиям, если мы выполним lexsort на соответствующей строке ключей:

>>> for i in range(3):
...     print(np.lexsort((x[i], y[i])))
[2 3 0 1]
[2 0 3 1]
[1 0 3 2]

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.lexsort.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API