lexsort()是numpy下的一个函数,可以实现对数组或列表按照某一行或列进行排序。
lexsort(keys, axis=-1)字面意思:用键值序列提供一个间接稳定的排序
返回一个描述多列排序次序的整数数组。键值序列的最后一个键值提供主排序顺序,倒数第二个提供第二个排序顺序……
如果键值参数是一个2D数组,那么数组的行就是排序的键,将会按照最后一行、倒数第二行……来排序
官网给出的几个例子:
Sort names: first by surname, then by name.1
2
3
4
5
6import numpy as np
surnames = (‘Hertz’, ‘Galilei’, ‘Hertz’)
first_names = (‘Heinrich’, ‘Galileo’, ‘Gustav’)
ind = np.lexsort((first_names, surnames))
ind
array([1, 2, 0])
这里ind就是函数按照surnames,first_names排序后返回的序号,排序过程为,先按照surnames提供的序列进行升序排序,当遇到相同的元素时,按照对应的first_names中的元素进行升序排列。
1
2>>>[surnames[i] + “, ” + first_names[i] for i in ind]
[‘Galilei, Galileo’, ‘Hertz, Gustav’, ‘Hertz, Heinrich’]
利用lexsort()对二维数组按照某一列排序
lexsort()的键参数是二维数组时,对行排序,排序的方式是先对最后一行排序,当有相同元素时,然后按照倒数第二行对应的元素排序,……以此类推。1
2
3
4
5
6
7
8
9>>>a=np.array([[1,2,1,5],[5,3,6,9],[6,2,9,5]])
>>>a
>>>array([[1, 2, 1, 5],
[5, 3, 6, 9],
[6, 2, 9, 5]])
>>>a1=np.lexsort(a)
>>>a1
>>>array([1, 3, 0, 2])
al返回的是a的最后一行按照从小到大排列后所对应的索引值,比如最后一行为[6,2,9,5],从小到达排列为:2,5,6,9;其相对的索引号为:1,3,0,2。
如果对a按照第二行升序排列,当有相同项时按照第一行升序排序,那么排序方法如下:
ind=np.lexsort(a[0:2,:])
A=a.T[ind].T
或者
A=a[:,ind]
这里需要注意,a[ind]是将a矩阵按照ind的次序对其行进行排列
利用lexsot()对数组按照某一列升序排列
注意lexsort()的特点,那么只需将数组矩阵做转置,将列变成行,行变成列就可以了。例如:对a矩阵按照第二列升序排列,当遇到相同元素时按照第一列升序排列。首先对a矩阵转置,这样矩阵的列变成了行,然后在对行按照第二行升序的方式排列,都获取相应的序列编号:
1
2
3
4
5
6
7
8
9
10
11
12
13>>>a=np.array([[1,2,1,5],[5,3,6,9],[6,2,9,5]])
>>>a
>>>array([[1, 2, 1, 5],
[5, 3, 6, 9],
[6, 2, 9, 5]])
>>>a2=np.lexsort(a.T[:2,:])
>>>a2
>>>array([0, 2, 1])
>>>a[a2,:]
array([[1, 2, 1, 5],
[6, 2, 9, 5],
[5, 3, 6, 9]])
后面有机会在研究一下axis怎么取值,以及对比一下sort、argsort、lexsort、partition、sorted几个排序的用法.
今天的文章python多列排序_用python中的numpy.lexsort()对矩阵按照某行(列)排序分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66332.html