python使用numpy實現多維數組的排序


1.問題描述

  為實現對多維數組按多列排序,如有三維數組坐標點(x,y,z),現需使其按照x進行升序排序,其后使y進行升序排序,最后為z。

# 有4行3列數組如下:
arr = [[6 3 3]
       [3 1 1]
       [6 2 8]
       [4 0 3]] 
# 欲使其按如下排序
arrSort=[[3 1 1]
         [4 0 3]
         [6 2 8]
         [6 3 3]]

2.解決方法

  想來應該有方法可以直接實現,故作為代碼搬運工查后發現numpy.lexsort()方法,官方文檔解釋見超鏈接。筆者理解如下:

  2.1 方法簡介

indicesAfterSort = numpy.lexsort(keys, axis)
# 返回值indicesAfterSort :排序后的索引即序號 
# 參數keys:指排序鍵,可以是(k, N) numpy數組,也可以是k個相同長度的序列構成的元組。
# 參數axis:好吧,我沒有弄明白,目前不影響使用。附官方文檔(int, optional:Axis to be indirectly sorted. By default, sort over the last axis.)
# 注意事項1:按照排序鍵優先級從后先前,如keys為(x,y,z),排序結果按照先按z排序,然后y,最后x。
# 注意事項2:當輸入的排序鍵為二維數組時按照行進行排序。排序鍵優先級依舊從后先前

  2.2 案例(還是案例最生動)

# 案例1
import numpy as np

arr = np.array([[6, 3, 6, 4], [3, 1, 2, 0], [3, 1, 8, 3]]).transpose()
print('%=============原始數據(4行3列)=================')
print(arr)
arrSortedIndex = np.lexsort((arr[:, 2], arr[:, 1], arr[:, 0]))
print('%======按照x優先,y次級,z最后規則排序后=======')
print(arr[arrSortedIndex , :])
arrSortedIndex = np.lexsort((arr[:, 0], arr[:, 1], arr[:, 2]))
print('%======按照z優先,y次級,x最后規則排序后=======')
print(arr[arrSortedIndex , :])

 

# 案例2 【針對注意事項2】
import numpy as np

arr = np.array([[6, 3, 6, 4], [3, 1, 2, 0]])
print('%=============原始數據(二維數組)===============')
print(arr)
arrSortedIndex = np.lexsort(arr)
print('%=================默認排序規則=================')
print(arr[:, arrSortedIndex])

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM