numpy argsort排序如何让其稳定排序

这篇具有很好参考价值的文章主要介绍了numpy argsort排序如何让其稳定排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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厉害,什么功能都有,而且很好用。

一切都在细节中……文章来源地址https://www.toymoban.com/news/detail-622695.html

到了这里,关于numpy argsort排序如何让其稳定排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 服务器的cpu如何通过脚本让其使用率变高

          最近遇到公司项目上线,在进行红蓝线查验时,由于部分服务器的配置高,但是使用率低,所以需要降配。为了避免降配,如何提高内存和cpu使用率呢?      可以通过脚本来实现。当前的服务器操作系统版本:redhat-7_5。      通过xshell连接服务器后,登录账户。  

    2024年02月04日
    浏览(45)
  • mysql GROUP BY 怎么 order by 排序

    在 MySQL 中使用 GROUP BY 子句时,如果需要对结果进行排序,可以使用 ORDER BY 子句来对分组后的结果进行排序。 ORDER BY 子句应该放在 GROUP BY 子句之后,使用逗号来分隔需要排序的列,并在排序列后指定排序顺序。例如: 在这个例子中,SELECT 语句选择了表 table1 中的列 column1 和

    2024年02月16日
    浏览(40)
  • Mybatis xml中排序(order by)条件用#{}查询失败

    问题描述: 处理简单分页时,发现从外部传入的排序条件无法生效,但程序无报错,正常返回列表,只是排序条件不对; 原因: #{}表示一个占位符,当#{}传入的数据是一个字符串时,会自动将传入的数据加一个双引号。 解决方法: 使用${}将传入的数据直接显示生成在sql中

    2024年01月17日
    浏览(32)
  • 【mysql学习篇】Order by与Group by优化以及排序算法详解

    Case1: 分析: 利用 最左前缀 法则:中间字段不能断,因此查询用到了name索引,从key_len=74也能看出,age索引列用在排序过程中,因为Extra字段里没有using filesort 注意: order by age 虽然用到了索引,但是不会在key_len列体现 Case 2: 分析: 从explain的执行结果来看:key_len=74,查询

    2024年02月15日
    浏览(48)
  • 【MySQL】union (all) 后 order by 子查询排序不生效问题解决方案

    2308. 按性别排列表格 表:Genders Column Name Type user_id int gender varchar user_id 是该表的主键(具有唯一值的列)。 gender 的值是 ‘female’,‘male’,‘other’ 之一。 该表中的每一行都包含用户的 ID 及其性别。 表格中 ‘female’,‘male’,‘other’ 数量相等。 编写一个解决方案以重新

    2024年01月17日
    浏览(46)
  • MySQL 数据库查询与数据操作:使用 ORDER BY 排序和 DELETE 删除记录

    使用 ORDER BY 语句按升序或降序对结果进行排序。 ORDER BY 默认按升序排序。要按降序排序结果,使用 DESC 。 示例按名称按字母顺序排序结果: ORDER BY DESC 使用 DESC 以降序排序结果。 示例按名称以字母逆序排序结果: 您可以使用\\\"DELETE FROM\\\"语句从现有表格中

    2024年02月05日
    浏览(63)
  • 玩转Mysql系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑

    这是Mysql系列第7篇。 环境:mysql5.7.25,cmd命令中进行演示。 代码中被[]包含的表示可选,|符号分开的表示可选其一。 本章内容 详解排序查询 详解limit limit存在的坑 分页查询中的坑 排序查询(order by) 电商中:我们想查看今天所有成交的订单,按照交易额从高到低排序,此

    2024年02月11日
    浏览(33)
  • 稳定的排序算法:直接插入排序和冒泡排序 (c++实现)

    1.直接插入排序: 插入排序:就是把数组分为左右两个序列,保持左边序列中所有元素是有序的,(当左边序列只有第一个元素时,本身就是有序的,)每次往后移一个,将这个元素保存起来,跟左边的元素进行比较,直到找到第一个小于它的元素后停下,此时的位置是这个

    2024年02月10日
    浏览(33)
  • 【八大排序(十)】八大排序效率与稳定性分析

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:八大排序专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 比较八大排序不能直接将 这八个排序放在一起讨论 我们根据大致效率将它们分为两组: (每个排序的详情链接在后面) 1. 第一组 插入排

    2024年02月11日
    浏览(41)
  • 【排序算法】详解冒泡排序及其多种优化&稳定性分析

    冒泡排序(Bubble Sort) 就是从序列中的 第一个元素 开始,依次对 相邻的两个元素 进行比较,如果前一个元素 大于 后一个元素则交换它们的位置。如果前一个元素 小于或等于 后一个元素,则不交换它们;然后每一轮目前的元素中最大的或最小的排到最上面,就像水中的泡泡冒

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包