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