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

     

  • 相关阅读:
    ASP.NET页面事件执行过程 总结
    程序员最应该读的图书(中译版) [收藏]
    C# 中的委托和事件的详解资料
    已添加项。字典中的关键字
    TFS 删除团队项目集合
    注册后第一篇
    类型的权限已失败 SqlClientPermission
    C#创建Oracle存储过程
    使用MySQL with 递归查询菜单树
    MySQL 常用TSQL(持续更新...)
  • 原文地址:https://www.cnblogs.com/waterbbro/p/14191092.html
Copyright © 2020-2023  润新知