Python数组排序 lexsort函数用法介绍


前言

最近开始对python语言做一点回顾,碰到一个二维数组的排序问题。一番搜索后,我发现网络上对这个问题的讲解杂乱无章,而且也晦涩难懂,所以,特别写一篇博客,供给有需要的朋友参考。

一、问题定义

先了解一下我们的问题是什么。假设给定一个3X3的二维数组[[2,3,4],[2,4,7],[8,7,5]]。现在想找一个方法,能够按照给定优先级,对这三行做一个大小上的排序。通俗的来说就是,一行数据为(x,y,z),我想先按照x的由大到小排列,再按y由大到小排列,最后按照z由大到小排序,如何实现?

二、方法讲解

1.基本思路

如果不借助工具,我们可以用比如冒泡排序去解决这个问题,下面要介绍的方法是Numpy中的排序函数lexsort(keys, axis=-1),第一个参数代表排序依据的键,第二参数axis可选,表示轴,一般不用。返回值是一个整数索引数组。这样说,你可能还不是很明白,我们看两个示例来了解用法。
(1)有两个数组A、B,先按照A由小到大排列,再按照B的大小由小到大排列。

代码如下(示例):

A = [5, 2, 3]
B = [4, 2, 2]
# 总共三个索引数字0 1 2
# 先按B的大小顺序,如果在B中的数字相同,那么比较在A中的数字大小
arrSortIndex = np.lexsort((A, B))
# 返回排序索引号 1 2 0
print(arrSortIndex)

注意:lexsort函数不直接改变原数组的值,所以要想改变原数组的值,还要做进一步的转化,看下面这个例子:

2.二维数组排序

代码如下:

import numpy as np

# 假设有三个三维坐标系坐标,现在按照x,y,z的优先级对坐标从大到小进行排序
arr = [[4, 2, 1], [1, 3, 3], [3, 5, 6]]
# 必须转换格式
arrTemp = np.array(arr)
# arrTemp[:, 2])表示二维数组中的第二列
arrSortIndex = np.lexsort((arrTemp[:, 2], arrTemp[:, 1], arrTemp[:, 0]))
newArr = []
# 直接取出索引 赋值
for num in arrSortIndex:
# 注意这个地方 我用的是arr赋值 而不是arrTemp
    newArr.append(arr[num]) 
# 最终结果[[1, 3, 3], [3, 5, 6], [4, 2, 1]]
arr = newArr

特别注意:代码中标注用arr赋值,而不是arrTemp赋值。这是因为arr和arrTemp的数据类型是不一样的,arr是List,而arrTemp是Array,两者的基本操作函数是不能混用的。我们要保持前后数据类型的一致性。

三、Python List的基本操作

1. 删除

2.插入

list = [1, 2, 3, 4]
# 直接插入到列表的最后
list.append(5)
# 1,2,3,4,5
print(list) 

总结

以上就是本次介绍的内容!如果对你有帮助的话,请不要吝啬你的点赞哦~

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值