利用Python中的lexsort()处理对矩阵中按照某一行/列进行排序,具体实例由下给出:
首先生成矩阵a,按照a中某行/列进行排序
# -*- coding: cp936 -*-
import numpy as np
a=np.array([[1,2,5,3],[5,3,6,9],[7,2,9,5]])
print a
输出结果:
[[1 2 5 3]
[5 3 6 9]
[7 2 9 5]]
1.按行排序
#对矩阵最后一行进行排序
a1=np.lexsort(a)
print "对a的最后一行升序排序后的索引"
print a1
print "对a的最后一行排序后的矩阵"
#方法1
A=a.T[a1].T
print A
#方法2
A=a[:,a1]
print A
输出结果:
对a的最后一行升序排序后的索引
[1 3 0 2]对a的最后一行排序后的矩阵
[[2 3 1 5]
[3 9 5 6]
[2 5 7 9]]
[[2 3 1 5]
[3 9 5 6]
[2 5 7 9]]
a1=np.lexsort(a[::-1,:])
print "对a的第一行升序排序后的索引"
print a1
print "对a的第一行排序后的矩阵"
A=a.T[a1].T
print A
输出结果:
对a的第一行升序排序后的索引
[0 1 3 2]
对a的第一行排序后的矩阵
[[1 2 3 5]
[5 3 9 6]
[7 2 5 9]]
a2=np.lexsort(a[0:2,:])
print "对a的第二行升序排序,得到的索引"
print a2
print "对a的第二行排序后的矩阵"
A=a.T[a2].T
print A
输出结果:
对a的第二行升序排序,得到的索引
[1 0 2 3]
对a的第二行排序后的矩阵
[[2 1 5 3]
[3 5 6 9]
[2 7 9 5]]
2.按列排序
对矩阵按照某一列升序排列,即将数组矩阵做转置,将列变成行,行变成列就可以了
#对a矩阵按照最后一列升序排列
a1=np.lexsort(a.T)#对a做转置,按照最后一行升序(相当于这里的最后一列)
print a1
print a[a1,:]#对应方法2
#对a矩阵按照最后一列降序排列
a1=np.lexsort(-a.T)
print a1
print a[a1,:]#对应方法2
输出结果:
[0 2 1]
[[1 2 5 3]
[7 2 9 5]
[5 3 6 9]][1 2 0]
[[5 3 6 9]
[7 2 9 5]
[1 2 5 3]]
#对a矩阵按照第一列升序排列
a1=np.lexsort(a[:,::-1].T)
print a1
print a[a1]
#对a矩阵按照第一列降序排列
a1=np.lexsort(-a[:,::-1].T)
print a1
print a[a1]
输出结果:
[0 1 2]
[[1 2 5 3]
[5 3 6 9]
[7 2 9 5]][2 1 0]
[[7 2 9 5]
[5 3 6 9]
[1 2 5 3]]
#对a矩阵按照第二列升序排列,当遇到相同元素时按照第一列升序排列
a1=np.lexsort(a.T[:2,:])#对a做转置,按照第二行升序(相当于第二列升序)
print a1
print a[a1,:]#对应方法2
#对a矩阵按照第二列降序排列
a1=np.lexsort(-a.T[:2,:])
print a1
print a[a1,:]
输出结果:
[0 2 1]
[[1 2 5 3]
[7 2 9 5]
[5 3 6 9]][1 2 0]
[[5 3 6 9]
[7 2 9 5]
[1 2 5 3]]