矩阵或二维数组按列排序
要把矩阵按列来进行升序和降序排列是很容易想到的,来源于数据库的思想。
数据库中表的结构是由行列所组成的
行对应一条记录
列对应属性
在数据库里
“select……from …… order by …… DES (or ASE)”
语句很容易对查询结果按照某个属性进行降序(升序)排序
如果我们把数据库的表想象成一个二维数组,如何做好按列的排序呢?
首先想到的是借助np包功能实现,把数组变成一个矩阵,类似数据库里面的表(如果你学过R语言就更好理解了,即数据框结构)
然后根据某一列得到顺序,对每行进行调整
关键函数np.lexsort()
np.lexsort会返回从小到大(升序)的数组编号,比如[2,6,5]返回的是[0,2,1]代表从大到小分别是第一个,第三个和第二个
案例演示
下面提供一个案例演示,目的是按照某列对每个记录进行排序。
首先构造一个二维数组并矩阵化:
import numpy as np
a= np.array([[1,4,7],[2,9,9],[0,5,2]])
可查看数组
print(input_xy)
- 按照最后一列降序排列
print(a[np.lexsort(-a.T)])
结果:
- 按照最后一列升序排列
思路:转置矩阵后,按转置的矩阵第一行得到序号数字,再用原矩阵重新生成矩阵
(注意注释)
print(a[np.lexsort(a.T)]) #a前面是否有负号决定升序降序,原理是取了相反数
- 按照第二列降序排列,如果第二列相同
稍复杂一点,思路是把这一列拿出来得到顺序后,对原来的二维数组进行排序
print(a[np.lexsort([-a.T[1]])]) #1代表第二列,如果是0则代表按第一列
完毕