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])