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

相关文章

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in