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 dom4j解析xml

    jar包下载 官网地址:点我直达 将jar包导入工程 package com.cyb; import java.io.InputStream; import java.security.Message ...

  2. VMware vCenter Server 7.0U3r 下载 - 修复堆溢出 (远程执行代码) 和本地权限提升漏洞

    VMware vCenter Server 是一款高级服务器管理软件,提供了一个集中式平台来控制 vSphere 环境,以实现跨混合云的可见性. 简化且高效的服务器管理 什么是 vCenter Ser ...

  3. SpringBoot 1.x 2.x配置文件指定服务项目名

    SpringBoot版本1.x: server.context-path=/demo SpringBoot版本2.x: server.servlet.context-path=/demo

  4. 使用浏览器的cookies进行登陆

    1.使用浏览器Cookie登陆 In [ ]: cookie = 'uniqueVisitorId=a2151df1-4833-00ae-72e0-f4b99d2b7be2; pgv_pvid=232 ...

  5. 《从零开始学习Python爬虫:顶点小说全网爬取实战》

    顶点小说 装xpath helper GitHub - mic1on/xpath-helper-plus: 这是一个xpath开发者的工具,可以帮助开发者快速的定位网页元素. Question:加载完 ...

  6. C#从6.0~9.0都更新了什么?

    一.C#6中新增的功能 get 只读属性 简洁的语法来创建不可变类型,仅有get访问器: public string FirstName { get; } public string LastName ...

  7. 张高兴的 MicroPython 入门指南:(三)使用串口通信

    目录 什么是串口 使用方法 使用板载串口相互通信 硬件需求 电路 代码 使用板载的 USB 串口 参考 什么是串口 串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART(Univ ...

  8. c++ 中遇到的语法问题

    在头文件中给函数赋值 如这样: func(int a,int b = 1); 在.cpp文件中不能同时这样写,否则会报错,只能这样写func(int a,int b ),所以从其他地方移植的代码需要注 ...

  9. 简单认识APP项目

    manifests:里面只有一个xml,是app运行配置文件 清单文件 <?xml version="1.0" encoding="utf-8"?> ...

  10. 对比python学julia(第一章)--(第一节)万事开头也不难

    自1989年被创立以后,历经30多年的发展,Python已经如日中天,在运维.大数据.云计算.web.科学计算上混的风生水起,并且于2020.2021年蝉联TIOBE年度编程语言首座.以至于,如今不会 ...