Numpy 如何让 argsort 两个相等的值排序

2024-06-19 22:12

本文主要是介绍Numpy 如何让 argsort 两个相等的值排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、场景

       遇到多个数组排序后存在相同元素的情况,如何让这些相同元素在排序结果中更加随机地分布,如何稳定排序,是一个不容易解决的问题,

二、numpy.argsort

       在NumPy中,numpy.argsort函数用于返回输入数组中元素排序后的索引数组,而不是直接对元素进行排序,在不改变原数组的基础上,实现了灵活的数据排序与索引操作。与numpy.sort直接返回排序后数组不同,argsort更加适用于需要原地排序或者基于排序进行其他操作的场景。

numpy.argsort(a, axis=-1, kind='quicksort', order=None)"""参数详解
a:待排序的数组。
axis(可选):沿着哪个轴进行排序,默认为-1,即最后一个轴。对于一维数组,此参数无效。
kind(可选):排序算法的类型,默认为’quicksort’。还可以选择’mergesort’、'heapsort’等,不同算法在效率和稳定性上有差异。
order(可选):当数组是结构化数组或记录数组时,可以按照字段名进行排序。
"""import numpy as np# 创建包含相同元素的数组
arr = np.array([3, 1, 2, 1, 3, 2, 3, 1, 1])
# 对数组进行排序并打印结果
sorted_indices = np.argsort(arr)
print("排序前的数组:", arr)
print("排序后的下标数组:", sorted_indices)
"""
排序前的数组: [3 1 2 1 3 2 3 1 1]
排序后的下标数组: [1 3 7 8 2 5 0 4 6]
"""x=np.array([2,6,3,8,9,-1])
#直接使用的两种形式
y=x.argsort()
z=np.argsort(x)

三、随机排序 

        一种解决方法是通过对排序后的下标数组进行迭代,找到相同元素以及它们的下标,然后将它们随机排列。

# 定义一个辅助函数,用于得到相同值的下标进行随机化处理
def randomize_same_value_indices(sorted_indices):sorted_values = arr[sorted_indices]indices_groups = np.split(sorted_indices, np.cumsum(np.unique(sorted_values, return_counts=True)[1])[:-1])for group in indices_groups:if group.size > 1:np.random.shuffle(group)return np.concatenate(indices_groups)# 对数组进行排序并随机处理相同元素
sorted_indices = randomize_same_value_indices(np.argsort(arr))
print("排序前的数组:", arr)
print("排序后的下标数组:", sorted_indices)
"""
排序前的数组: [3 1 2 1 3 2 3 1 1]
排序后的下标数组: [8 3 7 1 2 5 4 6 0]
"""

四、稳定排序

  • 逆序排序:要得到降序排列的索引,可以简单地对升序索引进行反向排序,即[::-1]操作。
  • 稳定性:对于需要稳定排序的应用场景(即相同元素的相对位置不变),可以选择’mergesort’算法。
  • 性能考量:虽然快速排序(quicksort)通常较快,但在数组元素分布极不均匀时,mergesort或heapsort可能是更好的选择。
import numpy as np# 创建包含相同元素的数组
arr = np.array([3, 1, 2, 1, 3, 2, 3, 1, 1])# 对数组进行排序并打印结果
sorted_indices = np.argsort(arr, kind='mergesort')
sorted_indices2 = np.argsort(-arr, kind='mergesort')
print("排序前的数组:", arr)
print("排序后的下标数组:", sorted_indices)"""
排序前的数组: [3 1 2 1 3 2 3 1 1]
排序后的下标数组: [1 3 7 8 2 5 0 4 6]
"""

 

 五、多维数组排序

import numpy as nparr = np.array([[5, 2, 3],
[4, 1, 6],
[7, 8, 9]])
#索引数组
ndx = np.argsort(arr,axis=1)
#排序后的数组
sorted_arr = np.take_along_axis(arr, ndx, axis=1)#axis=1是按行排序,axis=0是按列排序#打印
print(ndx)
print(sorted_arr)

六、结构化数组排序

import numpy as npdt = np.dtype([('name', 'S10'), ('age', int)])
data = np.array([('Alice', 24), ('Bob', 19), ('Charlie', 33)],dtype=dt)
# 按'age'字段排序
age_indices = np.argsort(data, order='age')
print(age_indices)

 

这篇关于Numpy 如何让 argsort 两个相等的值排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076292

相关文章

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常