numpy.lexsort

1
numpy.lexsort(key, axis=-1)

用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列。这里举一个应用场景:小升初考试,重点班录取学生按照总成绩录取。在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照英语成绩录取…… 这里,总成绩排在电子表格的最后一列,数学成绩在倒数第二列,英语成绩在倒数第三列。

举例:

1
2
3
4
5
>>> surnames = ('Hertz', 'Galilei', 'Hertz')
>>> first_names = ('Heinrich', 'Galileo', 'Gustav')
>>> ind = np.lexsort((first_names, surnames))
>>> ind
array([1, 2, 0])

打印查看效果:

1
2
>>> [surnames[i] + ", " + first_names[i] for i in ind]
['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich']

上面传入 np.lexsort 的是一个tuple,排序时首先排 surnames。由于 ‘G’ 在 ‘H’ 前面,因此第一个下标为 1,接下来 surnames 中有两个 ‘H’ 开头的单词,因此比较 first_names 中对应位置的单词开头,显然下标为 2 的单词应该排在前面。综上排序结果为 array([1,2,0])。

排列两个数组:

1
2
3
4
5
>>> 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]

打印查看效果:

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

传入 array:

1
2
3
4
5
6
>>> x = np.array([[1,4,-3,2],[5,10,9,2]])
>>> x
array([[ 1, 4, -3, 2],
[ 5, 10, 9, 2]])
>>> np.lexsort(x)
>>> array([3, 0, 2, 1])

当传入二维数组时,将把数组中每行看成电子表格中的一列,并按照最后一列的顺序为第一优先级进行排列。

当传入高于二维的数组时,axis 参数才有意义,它决定了排序到底按照哪个轴进行排序,具体应用场景不多,就不举例了。