numpy.argsort(aaxis=-1kind=Noneorder=None)

Parameters:

aarray_like

Array to sort.

axis int or None, optional

Axis along which to sort. The default is -1 (the last axis). If None, the flattened array is used.

kind {‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’}, optional

Sorting algorithm. The default is ‘quicksort’. Note that both ‘stable’ and ‘mergesort’ use timsort under the covers and, in general, the actual implementation will vary with data type. The ‘mergesort’ option is retained for backwards compatibility.

Changed in version 1.15.0.: The ‘stable’ option was added.

order str or list of str, optional

When a is an array with fields defined, this argument specifies which fields to compare first, second, etc. A single field can be specified as a string, and not all fields need be specified, but unspecified fields will still be used, in the order in which they come up in the dtype, to break ties.

Returns:

index_arrayndarray, int

Array of indices that sort a along the specified axis. If a is one-dimensional, a[index_array] yields a sorted a. More generally, np.take_along_axis(a, index_array, axis=axis) always yields the sorted a, irrespective of dimensionality.

我们知道,argsort可以将数组进行排序,返回是排序后的索引,但是默认是按照从小到大排序的,然后通常做法是将其逆序回来。

test = np.array([1,0,0,1,1,1,1,1,0,0,2,2,2,0,0,0,1,0,0,1,1,1])
print (np.argsort(test)[-1]) 

这里有几个问题:

1. 默认argsort用的是quicksort排序算法,这种方式排序是不稳定的。对稳定的排序算法来说,每次排序结果都一样,而且相同的两个元素,先出现的还是排在前面。

2. 取-1逆序,会打乱数组的顺序。

为什么呢?

可以从argsort的参数看一下,尤其是kind 这个参数这里,默认是quicksort,这个是不稳定的。而对stable, mergesort两个用的都是timsort方法,这种方法是世界上最快的算法,是结合了插入排序和归并排序稳定的排序算法,并做了许多优化, 在实际应用中效率很高。而stable是后来版本才出现的,而mergsort是为了兼容旧版本,那么stable,mergesort两种方法得到的结果应该是一样的。

test = np.array([1,0,0,1,1,1,1,1,0,0,2,2,2,0,0,0,1,0,0,1,1,1])
print (np.argsort(test,kind='mergesort')[-1]) ##这样做无法做到先出现的排在前面


result = np.argsort(test)
result1 = np.argsort(test, kind='stable') result2 = np.argsort(test, kind='mergesort') print (result)
print (result1)
print (result2)

  

因此,如果你想得到的排序是稳定的,设置kind=stable或者mergesort就可以了,这样能得到稳定的从小达大排序的索引号。但是如果你想得到的是从大到小的排序,又要是稳定算法,是不可以直接逆序进行的,因为这样你跑坏了先出现排在前面的原则。

那么怎么办呢?

在排序时,对数组进行取负,然后直接用argsort进行排序,当然还是要kind=mergesort,这个时候是从大到小排序并且是稳定排序。

test = np.array([1,0,0,1,1,1,1,1,0,0,2,2,2,0,0,0,1,0,0,1,1,1])
print (np.argsort(test,kind='mergesort')[-1]) ##这样做无法做到先出现的排在前面 print ((-test).argsort(kind='mergesort'))
print (np.argsort(-test, kind='mergesort'))

  

如此一来就能得到稳定的从大到小排序,并且稳定的,先出现的排在前面。代码中后面两种方式一样,这个是毋庸置疑的。

平时我们只关注排序,大概不会注意到中间的差异,但是当你做工程时,如果不注意这些细节是很难做到方便工程上使用的。因此,别看一个小小的函数,影响还是很大的。工程上稳定排序是肯定的,但是argsort默认不是稳定的,而且如果你想从大到小,不是直接逆序就能满足的。

当然如果你想要一个直接进行从大到小排序好的数组,可以直接用numpy.sort即可,用法和argsort是一样的。也是通过配置这些参数达到稳定的排序。要说对数据进行计算,还是numpy厉害,什么功能都有,而且很好用。

一切都在细节中……

numpy argsort排序如何让其稳定排序的更多相关文章

  1. 备战秋招之十大排序——O(n^2)级排序算法

    一.冒泡排序 冒泡排序是入门级的算法,但也有一些有趣的玩法.通常来说,冒泡排序有三种写法: 一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位: 经过优化的写法:使用一个变量记录当前轮次的比 ...

  2. hdu 1872 稳定排序

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1872 稳定排序 Description 大家都知道,快速排序是不稳定的排序方法.如果对于数组中出现的任 ...

  3. hdoj 1872 稳定排序

    稳定排序 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 稳定排序nlogn之归并排序_一维,二维

    稳定排序nlogn之归并排序_一维,二维 稳定排序:排序时间稳定的排序 稳定排序包括:归并排序(nlogn),基数排序[设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排 ...

  5. HDU 1872:稳定排序

    稳定排序 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. 中南oj 1215: 稳定排序

    1215: 稳定排序 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 111  Solved: 43 [Submit][Status][Web Boar ...

  7. E - 稳定排序(结构体)

    大家都知道,快速排序是不稳定的排序方法. 如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的. 某 ...

  8. STL-C - 稳定排序

    C - 稳定排序 大家都知道,快速排序是不稳定的排序方法.如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排 ...

  9. 华为OJ—字符串排序(排序,忽略指定字符排序)

    http://career-oj.huawei.com/exam/ShowProblemInfo?id=2168 编写一个程序,将输入字符串中的字符按如下规则排序. 规则1:英文字母从A到Z排列,不区 ...

  10. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

随机推荐

  1. Java-JDBC的对象DriverManager,Connection,ResultSet,PreparedStatement,工具类:JDBCUTILS,JDBC控制事务

    1. 概念 Java DataBase Connectivity Java 数据库连接 Java语言操作数据库 JDBC本质:其实是官方(sun)公司的一套操作所有关系型数据库的规则,即接口.各个数据 ...

  2. 全网最适合入门的面向对象编程教程:02 类和对象的Python实现-使用Python创建类

    全网最适合入门的面向对象编程教程:02 类和对象的 Python 实现-使用 Python 创建类 摘要 本文主要介绍了串口通信协议的基本概念.串口通信的基本流程.如何使用 Python 语言创建一个 ...

  3. PHP集群session共享

    集群的概念没有多复杂,其实就是多台电脑为了同一个目标在一起工作.在Web应用中,就是多个服务器提供一个站点的服务. 搭建PHP集群的第一步就是设置负载均衡. 默认情况下PHP是将session存在本地 ...

  4. tp5命名规范

    tp5中对类,文件名,函数和方法的命名规范如下: 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写) 类的命名采用驼峰法,并且首字母大写,例如 User.UserType,不需要添加contr ...

  5. C#封装HttpClient工具类库(.NET4.5以上)

    1.Json字符串实体转换扩展方法,依赖Json.Net包 /// <summary> /// Json扩展方法 /// </summary> public static cl ...

  6. JavaScript小面试~~JavaScript实现图片懒加载,多方式解决加载过多问题

    图片懒加载,就是滚动页面时,图片未出现在可视局域时不加载图片,只有图片出现在可视区域才加载. 思路:通过上面一段话,实现图片懒加载需要知道: 绑定滚动事件 可视窗口高度(VH) 图片元素距离可视局域顶 ...

  7. 微软CrowdStrike驱动蓝屏以及内核签名

    原因 当Windows操作系统遇到严重错误导致系统崩溃时,屏幕显示为蓝色,通常伴有错误代码和信息,这被称为"蓝屏死机"(Blue Screen of Death,简称BSOD) h ...

  8. 【服务器】Ubuntu虚拟内存设置

    引子 最近服务器内存老是爆掉,64G的内存对于四五个人同时使用还是有点勉强,上网查询了一下虚拟内存的教程,本博客记录一下方法. swap内存设置 假设你想将swap文件放在/mnt/data/mem目 ...

  9. pycharm中可以运行脚本(只在控制台运行,Debugger不运行,设置的断点没用)但是不能debug脚本

    以前用的时候好好地,但是最近上班突然脚本就不能debug了,debug直接报错,如下所示 上网查过该有的原因: 1.在pycharm中两个地方设置成utf-8,页面右下角和File>settin ...

  10. docker 网络互通

    自定义网络 查看所有的docker网络 网络模式 [root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE a4d70d5796e ...