「Python数据科学」一文掌握NumPy实现数组排序相关的多种方法

南宫理的日志录 2025-01-02 13:17:58
引言

对数据进行查找和排序是计算机科学中最常用的基础操作,而为了实现高效的查找,最常用的手段是将数据进行排序,从而实现在有序数据中的快速查找。

NumPy作为数据科学的基础核心库,提供了多种数据排序的方法,本文就来逐一介绍。

本文的主要内容有:

1、基础排序

2、间接排序

3、部分排序

4、指定排序算法

5、有序数组中的查找

基础排序

NumPy中提供了两种用于排序的方法:

1、np.sort()

2、ndarray.sort()

这两种方法都可以实现对数组的排序,区别在于:np.sort()不会修改原数组,会返回数组的排序副本;而ndarray.sort()函数会在原地排序。

通过代码简单演示这两种方法:

此外,针对多维数组的排序,这两种方法都支持axis参数,来指定排序的轴,从而实现将多维数组在任何一个轴向上对其一维数据进行排序。

同样通过代码演示:

可以看到,分别实现了列方向、行方向上的数据升序排列。如果需要降序的操作,我们可以通过data[::-1]的技巧,轻松实现。

间接排序

除了基础排序的方法,NumPy中还提供了进行间接排序的方法,这里所谓的间接排序,可以实现如下场景需求:

1、获取排序后的索引位置,而不更改数组

2、根据一个或多个键进行排序,比如先按照成绩排序,成绩相同则按照姓名排序等

NumPy中通过ndarray.argsort()函数,实现获取排序后的索引数组的需求:

如果需要对多个键进行排序,或者多个数组进行联合排序,可以使用NumPy中的np.lexsort()函数。

还是通过代码来具体查看:

在使用np.lexsort()进行联合排序时,需要注意,传给函数的多个数组构成的列表或者元组,排序时,会首先按照最后一个数组进行排序,其次是倒数第二个,以此类推。

部分排序

实际工作场景中,有时候我们不需要将数组进行全排序,可能只需要找出最大的元素或者最小的元素,也可能是最小的n个元素等。

针对这种部分排序的场景,NumPy中提供了两个围绕第k个最小元素进行数组划分的快速方法,也就是np.partition()和np.argpartition()。

通过代码,演示这两个函数的使用:

通过上述代码,可以看到,实现了对数组的分割,前3个位置,为最小的元素,后面的位置为其他元素。需要说明的是,这两段不保证有序。

同样,需要找出最大的3个元素,可以通过数组长度-3的形式来变相获取。

指定排序算法

在评估排序时,有一个很关键的特性叫做排序的”稳定性“,该特性能够保证:

如果两个元素相等,则它们的相对位置在排序后不发生改变。

排序的稳定性在有些场景中,是非常重要的。归并排序(mergesort)可以保证排序的稳定性,但是,其平均性能要比默认的快速排序(quicksort)要差一些。

可选的排序算法,主要有如下三种:

在进行上述排序时,可以通过参数kind进行算法的指定。

比如:

有序数组中的查找

NumPy中还提供了searchsorted()函数,用于在有序数组上执行二分查找的数组方法,它返回的是数组中的位置,也就是将该值插入数组中返回的位置时,可以依然维持数组的有序性。

除了可以传入一个标量值,还可以传入一个数值数组,对应的返回值为索引数组。

通过具体代码演示:

通过ndarray.searchsorted()和np.searchsorted()都可以实现相同的效果。

此外,函数还有一个side参数,默认值为'left'表示返回找到的第一个位置,如果传入'right',则表示返回找到的最后一个位置。

总结

本文介绍了NumPy中关于数组排序的各种常用的方法,包括用于基础排序的sort()函数,用于进行间接排序的argsort()和关联排序的lexsort(),以及用于部分排序的partition()和argpartition()。同时介绍了NumPy中支持的常用的排序算法,以及如何在有序数组中查找相关元素位置等。

以上就是本文的全部内容,感谢您的拨冗阅读!

0 阅读:2
南宫理的日志录

南宫理的日志录

深耕IT科技,探索技术与人文的交集