Numpy中的排序相关操作sort,argsort,partition,argpartition
今天遇见的程序里某一行需要用到numpy中的argpartition()函数,顺便复习一下numpy中的排序相关的函数
1.np.sort()
np.sort(a, axis=-1, kind='quicksort', order=None)
参数 | 参数说明 |
---|---|
a | 待排序数组array |
axis=-1 | 默认按最后一个轴进行排序,axis=0,按行进行排序,axis=1,按列进行排序,简单示意图如下 |
kind | 具体采用的排序方法,有{‘quicksort’, ‘mergesort’, ‘heapsort’}可供选择一般默认即可 |
order | 一个字符串或列表,可以按照某个属性进行排序,当a是一个定义了字段的数组时有用 |
具体示例:
关于order参数,创建如下结构数组:
按照指定属性进行排序:
2.np.argsort()
与sort基本一致,不过不是返回的排序完成后的元素数组,而是排序完成后相应元素对应的索引数组
元素2对应索引0,元素3对应索引3等等
3.np.partition()
要了解argpartition()
方法最好先了解partition()
,因为argpartition()
只不过是在partition()
的基础上返回排序完成数组的索引号罢了
partition(a, kth, axis=-1, kind='introselect', order=None)
参数 | 参数说明 |
---|---|
a | 待排序数组array |
kth | 数组元素中从小到大的第k个值将在处于其最终排序位置k(下面例子具体说明) |
axis=-1 | 默认按最后一个轴进行排序 |
kind | 具体采用的排序方法,一般默认即可 |
order | 一个字符串或列表,可以按照某个属性进行排序,当a是一个定义了字段的数组时有用 |
具体例子
表示数组a中第2小
的元素即元素2位于排序完成数组b
的第二个位置
上,即索引b[1]
处,然后小于该元素的位于该元素左边,大于该元素的位于右边,左右两边没有特别的排序要求,只要求左边小于该元素,右边大于该元素即可
表示数组a中第4小
的元素即元素6位于排序完成数组b
的第四个位置
上,即索引b[3]
处
kth也可以是负数
表示数组a中第2大
的元素即元素8位于排序完成数组b
的倒数第2个位置
上,即索引b[-2]
处
当然,这有个什么用啊?用处之一就是如果我们有一个非常大的数组,假如我们想要找到其中最大的10个数,怎么办呢,我们可以用sort函数,然后排序完成后取出来,但是数组太大时这一方法比较耗时,所以我们可以采用partition函数,partition只对数组进行一遍排序,找到k位置的数即可,而对k位置左右的排序不关心,工作量少意味着其效率快
假如我们想找到a中的最大3个元素,我们该怎么操作呢?
相应找到最小的3个元素也很简单:
4.argpartition()
与partition()类似,不过返回的不是分区排序好的元素数组,而是排序完成的元素索引数组
如:
其中元素3对应索引4,元素4对应索引5,元素5对应索引1,等等