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

相关文章

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

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

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

鸡尾酒排序算法

目录 引言 一、概念 二、算法思想 三、图例解释 1.采用冒泡排序:   2.采用鸡尾酒排序:  3.对比总结 四、算法实现  1.代码实现  2.运行结果 3.代码解释   五、总结 引言 鸡尾酒排序(Cocktail Sort),也被称为双向冒泡排序,是一种改进的冒泡排序算法。它在冒泡排序的基础上进行了优化,通过双向遍历来减少排序时间。今天我们将学习如何在C

快速排序(java代码实现)

简介: 1.采用“分治”的思想,对于一组数据,选择一个基准元素,这里选择中间元素mid 2.通过第一轮扫描,比mid小的元素都在mid左边,比mid大的元素都在mid右边 3.然后使用递归排序这两部分,直到序列中所有数据均有序为止。 public class csdnTest {public static void main(String[] args){int[] arr = {3,

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,