numpy.lexsort#
- numpy.lexsort(ключи, ось=-1)#
Выполнить косвенную устойчивую сортировку с использованием последовательности ключей.
При наличии нескольких ключей сортировки lexsort возвращает массив целочисленных индексов, который описывает порядок сортировки по нескольким ключам. Последний ключ в последовательности используется для первичного порядка сортировки, совпадения разрешаются предпоследним ключом и так далее.
- Параметры:
- ключи(k, m, n, …) array-like
The k ключи для сортировки. The last ключ (например, последняя строка, если ключи является 2D массивом) является основным ключом сортировки. Каждый элемент ключи вдоль нулевой оси должен быть объектом, подобным массиву, той же формы.
- осьint, необязательный
Ось для косвенной сортировки. По умолчанию сортировка выполняется по последней оси каждой последовательности. Отдельные срезы вдоль ось сортируется независимо; см. последний пример.
- Возвращает:
- индексы(m, n, …) ndarray из целых чисел
Массив индексов, сортирующих ключи вдоль указанной оси.
Смотрите также
argsortКосвенная сортировка.
ndarray.sortСортировка на месте.
sortВозвращает отсортированную копию массива.
Примеры
Сортировать имена: сначала по фамилии, затем по имени.
>>> import numpy as np >>> 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])
Нулевая ось ключи всегда соответствует последовательности ключей, поэтому 2D массивы обрабатываются так же, как и другие последовательности ключей.
>>> arr = np.asarray([b, a]) >>> ind2 = np.lexsort(arr) >>> np.testing.assert_equal(ind2, ind)
Соответственно, ось параметр относится к оси каждый ключ, а не ключи сам аргумент. Например, массив
arrрассматривается как последовательность двух одномерных ключей, поэтому указаниеaxis=0эквивалентно использованию оси по умолчанию,axis=-1.>>> np.testing.assert_equal(np.lexsort(arr, axis=0), ... np.lexsort(arr, axis=-1))
Для массивов более высокой размерности параметр оси начинает иметь значение. Результирующий массив имеет ту же форму, что и каждый ключ, и значения соответствуют тому, что мы ожидаем, если
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]