深入探索np.argsort的各个细节

一、概述

np.argsort是numpy模块中的一个函数,可返回一维数组中元素排序后的下标。该函数返回的是排序后各元素相对于原数组的下标值,并且数组元素值不变。

二、基本语法

np.argsort有三个参数:

numpy.argsort(a, axis=-1, kind='quicksort', order=None)

a表示需要排序的数组,axis表示排序的方向(默认-1,即从最后一个维度开始排序),kind表示使用的排序算法(默认是快速排序),order表示按照某一列排序(用于结构体做比较)。

举个例子:

import numpy as np

a = np.array([3, 1, 4, 2])
idx = np.argsort(a)
print(idx)

输出结果为:array([1, 3, 0, 2], dtype=int64)

说明原数组中第1个元素(1)排在第一个,第3个元素(2)排在第二个,第0个元素(3)排在第三个,第2个元素(4)排在第四个。

三、多个数组排序

可以使用argsort对多个数组排序,只需将多个数组组合成一个元组,然后将这个元组作为一个参数传给argsort即可:

import numpy as np

x = np.array([3, 1, 4, 2])
y = np.array([5, 7, 6, 8])
idx = np.argsort((x, y))
print(idx)

输出结果为:array([1, 3, 0, 2], dtype=int64)

说明两个数组按照x的排序顺序排序,这是它们的联合排序顺序。

四、逆序排序

默认情况下,np.argsort函数执行的是升序排序。如果想按降序排序,在调用np.argsort函数时,可将需要排序的数组加上一个负号,并指定axis参数(不能是None)。

import numpy as np

a = np.array([3, 1, 4, 2])
idx = np.argsort(-a, axis=0)
print(idx)

输出结果为:array([2, 0, 3, 1], dtype=int64)

说明原数组中第2个元素(4)排在第一个,第0个元素(3)排在第二个,第3个元素(2)排在第三个,第1个元素(1)排在第四个。

五、实战应用:排序并获取对应原下标

有时候需要将原数组的下标和按下标排序后的结果一起输出。这时仍然可以使用np.argsort函数,然后对结果应用相应的矩阵计算即可。

import numpy as np

a = np.array([3, 1, 4, 2])
idx = np.argsort(a)
print(idx)
print(idx.argsort())
print(np.arange(len(idx)))
sort_idx = np.argsort(idx)
print(sort_idx)
print(sort_idx.argsort())

输出结果为:

[1 3 0 2]
[2 0 3 1]
[0 1 2 3]
[1 3 0 2]
[2 0 3 1]

从输出结果可以看出,idx.argsort()等同于np.arange(len(idx)),这是因为argsort返回的是排序后原下标的顺序,这样再应用一次argsort就可以得到原下标了,即sort_idx=argsort(argsort(idx)),然后再对sort_idx排序就可以得到最终结果。

六、总结

在numpy中,np.argsort是非常常用的排序函数,掌握该函数的使用方法和注意事项对于numpy编程非常重要。尤其是在需要对多个数组进行排序、降序排序、重组原数组的下标等操作时,np.argsort起到了非常重要的作用。

原创文章,作者:JOUW,如若转载,请注明出处:https://www.506064.com/n/131412.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JOUWJOUW
上一篇 2024-10-03 23:45
下一篇 2024-10-03 23:45

相关推荐

  • int类型变量的细节与注意事项

    本文将从 int 类型变量的定义、声明、初始化、范围、运算和类型转换等方面,对 int 类型变量进行详细阐述和讲解,帮助读者更好地掌握和应用 int 变量。 一、定义与声明 int…

    编程 2025-04-29
  • Python中的np.arange函数

    在本篇文章中,我们将着眼于Python中的np.arange函数。我们将从多个方面对这个函数进行全面解析,涵盖的内容包括介绍、功能、用法、案例以及注意事项等。如果您想深入了解np.…

    编程 2025-04-28
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 浮点型数据的细节揭秘

    一、基本概念 浮点型数据是指可以表示实数的一种数据类型。在C语言中,浮点型数据有两种类型:float(单精度浮点数)和double(双精度浮点数)。其中,float数据类型占用4个…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25

发表回复

登录后才能评论