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