对数据进行查找和排序是计算机科学中最常用的基础操作,而为了实现高效的查找,最常用的手段是将数据进行排序,从而实现在有序数据中的快速查找。
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中支持的常用的排序算法,以及如何在有序数组中查找相关元素位置等。
以上就是本文的全部内容,感谢您的拨冗阅读!