numpy.lexsort#

numpy.lexsort(keys, axis=-1)#

使用一連串的鍵執行間接穩定排序。

給定多個排序鍵,lexsort 會傳回整數索引的陣列,該陣列描述依多個鍵的排序順序。序列中最後一個鍵用於主要排序順序,關係由倒數第二個鍵打破,依此類推。

參數:
keys(k, m, n, …) 類陣列

要排序的 k 個鍵。最後一個鍵(例如,如果 keys 是 2D 陣列,則為最後一列)是主要排序鍵。keys 沿著第零軸的每個元素都必須是相同形狀的類陣列物件。

axisint,選用

要間接排序的軸。預設情況下,對每個序列的最後一個軸進行排序。沿著 axis 的個別切片會獨立排序;請參閱最後一個範例。

傳回:
indices(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])

keys 的第零軸始終對應於鍵的序列,因此 2D 陣列的處理方式與其他鍵序列相同。

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

因此,axis 參數指的是每個鍵的軸,而不是 keys 引數本身的軸。例如,陣列 arr 被視為兩個 1-D 鍵的序列,因此指定 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]