前言
最近开始对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)
总结
以上就是本次介绍的内容!如果对你有帮助的话,请不要吝啬你的点赞哦~