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

 

原文地址:https://www.cnblogs.com/waterbbro/p/14191092.html