python 對矩陣的(某一行/某一列)按照(升序/降序)排序,並輸出排序後的矩陣。lexsor()函式例項
阿新 • • 發佈:2020-12-19
利用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]]