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

本文详细介绍了如何使用Python的Numpy库进行二维数组按指定优先级排序,包括lexsort函数的应用,以及Python List的基本操作,如删除和插入。适合初学者理解二维数组处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

最近开始对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) 

总结

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

### 使用 NumPy 对数组进行排序 NumPy 提供了多种方法用于对数组进行排序。以下是几种常见的排序方式及其示例。 #### 单维数组排序 对于单维数组,可以使用 `np.sort` 函数对其进行升序排列[^2]: ```python import numpy as np arr = np.array([3, 1, 4, 2, 5]) sorted_arr = np.sort(arr) print(sorted_arr) # 输出: [1 2 3 4 5] ``` 如果需要降序排列,则可以通过反转已排序的结果实现: ```python desc_sorted_arr = sorted_arr[::-1] print(desc_sorted_arr) # 输出: [5 4 3 2 1] ``` #### 多维数组排序 当处理多维数组时,可以选择沿着特定轴进行排序。默认情况下,`np.sort` 沿最后一个轴排序[^3]: ```python multi_dim_arr = np.array([[3, 1], [4, 2]]) sorted_multi_dim_arr = np.sort(multi_dim_arr, axis=0) print(sorted_multi_dim_arr) # 输出: # [[3 1] # [4 2]] ``` 在此例子中,沿第零轴(列方向)进行了排序。 #### 字典顺序排序 通过 `np.lexsort` 可以基于多个键按照字典顺序对数据进行排序[^2]。以下是一个简单实例: ```python x = np.array([3, 1, 4, 2, 5]) y = np.array([9, 7, 8, 6, 5]) idx = np.lexsort((x, y)) sorted_x = x[idx] sorted_y = y[idx] print(sorted_x) # 输出: [1 2 3 4 5] print(sorted_y) # 输出: [7 6 9 8 5] ``` 这里先依据 `y` 排序再考虑 `x` 的值完成最终排序次序。 #### 查找元素位置并排序 有时可能希望找到某个目标值的位置后再执行其他操作。这可通过组合函数如 `np.searchsorted` 实现[^4]: ```python a = np.array([1, 2, 3, 4, 5]) x = 3 v = np.searchsorted(a, x) if a[v % len(a)] == x: print(v) # 输出: 2 else: print(-1) ``` 此代码片段展示了如何高效定位数值所在索引,并判断其是否存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值