1. 程式人生 > 其它 >python 對矩陣的(某一行/某一列)按照(升序/降序)排序,並輸出排序後的矩陣。lexsor()函式例項

python 對矩陣的(某一行/某一列)按照(升序/降序)排序,並輸出排序後的矩陣。lexsor()函式例項

技術標籤:Pythonpythonnumpy

利用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]]