numpy.lexsort

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.lexsort.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

numpy.lexsort(keys, axis=-1)

使用键序列执行间接排序。

给定多个排序键(可以在电子表格中解释为列),lexsort返回一个整数索引的数组,用多个列描述排序顺序。序列中的最后一个键用于主要排序顺序,第二个至最后一个键用于辅助排序顺序,依此类推。keys参数必须是可以转换为相同形状的数组的对象序列。如果为keys参数提供了2D数组,那么它的行将被解释为排序键,排序将根据最后一行,第二行等。

参数:

:(k,N)数组或包含k(N,)形序列的元组

要排序的k不同的“列”。最后一列(或如果是2D数组的行)是主排序键。

axis:int,可选

轴间接排序。默认情况下,排序最后一个轴。

返回:

indices:(N,)ndarray of ints

沿指定轴对键进行排序的索引数组。

也可以看看

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 = [1,5,1,4,3,4,4] # First column
>>> b = [9,4,0,4,0,2,1] # Second column
>>> ind = np.lexsort((b,a)) # Sort by a, then by b
>>> print(ind)
[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)]

注意,排序首先根据a的元素。二次分类根据b的元素。

正常的argsort会产生:

>>> [(a[i],b[i]) for i in np.argsort(a)]
[(1, 9), (1, 0), (3, 0), (4, 4), (4, 2), (4, 1), (5, 4)]

结构化数组由argsort按词法排序:

>>> x = np.array([(1,9), (5,4), (1,0), (4,4), (3,0), (4,2), (4,1)],
...              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])