楔子

numpy中有几个以arg开头的函数,非常的神奇,因为它们返回的不是元素、而是元素的索引,我们来看一下用法,这里只以一维数组为例。

np.argmax

首先np.max是获取最大元素,那么np.argmx是做什么的呢?

import numpy as np

arr = np.array([3, 22, 4, 11, 2, 44, 9])

print(np.max(arr)) # 44

print(np.argmax(arr)) # 5

我们看到np.max是获取数组中最大的元素,np.argmax是获取数组中最大元素对应的索引。

同理还有np.argmin,np.min是获取数组中最小的元素,显然是2;np.argmin是获取数组中最小元素对应的索引,显然是4。

import numpy as np

arr = np.array([3, 22, 4, 11, 2, 44, 9])

print(np.min(arr)) # 2

print(np.argmin(arr)) # 4

np.argwhere

np.where我们算是经常使用了,先来复习一下它的用法吧。

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

# 如果元素大于4, 那么减去10; 否则扩大十倍

print(np.where(arr > 4, arr - 10, arr * 10)) # [10 20 30 40 -5 -4 -3 -2]

# 如果元素大于4, 那么保持不变, 否则变成4

print(np.where(arr > 4, arr, 4)) # [4 4 4 4 5 6 7 8]

和np.where作用类似的还有一个np.clip,来看一下。

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

# 小于2的换成2, 大于6的换成6, 一般在设置上下限的时候非常有用

print(np.clip(arr, 2, 6)) # [2 2 3 4 5 6 6 6]

那么np.where是做啥的呢?首先这个函数只接受一个参数,找出索引满足条件的元素对应的索引。

import numpy as np

arr = np.array([3, 4, 5, 6, 7])

print(np.argwhere(arr % 2 != 0))

"""

[[0]

[2]

[4]]

"""

print(np.argwhere(arr % 2 != 0).flatten()) # [0 2 4]

显然元素3、5、7在%2之后不为0,所以会筛选出它们的索引,因此是[0 2 4]。只不过默认不是一个一维数组,我们需要再调用一下flatten,将其扁平化。

np.argsort

np.sort是用来排序的,类似于Python的内置函数sorted。

import numpy as np

arr = np.array([4, 2, 3, 6, 5, 1])

print(np.sort(arr)) # [1 2 3 4 5 6]

sort很容易,再来看看argsort。

import numpy as np

arr = np.array([4, 2, 3, 6, 5, 1])

print(np.sort(arr)) # [1 2 3 4 5 6]

print(np.argsort(arr)) # [5 1 2 0 4 3]

sort是将从小到大排序之后返回,argsort是返回从小到大排序之后元素对应的索引。比如:第一个元素是5,表示原来数组中索引为5的元素在排序之后应该排在第一个位置上。

因此,通过argsort我们可以选出topN的元素。

import numpy as np

arr = np.array([4, 2, 3, 6, 5, 1, 8, 9, 7])

print(arr[np.argsort(arr)[-3:]]) # [7 8 9]

# 当然sort本身也是可以的

print(np.sort(arr)[-3:]) # [7 8 9]

下面看一个问题,如果我想查看数组中每一个元素在排完序之后对应的索引该怎么办呢?

以数组:[3 2 1 4]为例,在排完序之后结果显然是[1 2 3 4],那么原来的元素3应该在索引为2的位置上、元素2在索引为1的位置上、元素1在索引为0的位置上、元素4在索引为3的位置上,所以我们希望得到一个数组[2 1 0 3],那么要怎么做?

import numpy as np

arr = np.array([88, 79, 86, 97, 89, 95, 84])

# 调用一次argsort显然是不够的, 它表示排完序之后原来的元素对应的索引

print(np.argsort(arr)) # [1 6 2 0 4 5 3]

# 如果我们连续调用两次argsort的话, 另外np.argsort(arr) <==> arr.argsort()

print(arr.argsort().argsort()) # [3 0 2 6 4 5 1]

# 此时就大功告成了

# 数组[3 0 2 6 4 5 1]表示:

# arr中第一个元素88在排完序之后应该处于索引为3的位置

# 79在排完序之后应该处于索引为0的位置

# ...

以88为例,显然它在排序之后索引为3,所以对arr.argsort()得到的数组再进行一次argsort即可得到我们想要的结果。这个可能有点绕,使用言语表达起来实在是不太容易,可以自己看着图尝试一下。

np.argpartition

argpartition类似于argwhere,但它只是局部排序,举例说明:

import numpy as np

arr = np.array([66, 15, 27, 33, 19, 13, 10])

"""

np.partition(arr, n)

找出arr中第n + 1小的元素(将arr排序之后索引n的元素), 然后返回一个新数组

并将原来数组中第n + 1小的元素放在新数组索引为n的地方, 保证左边的元素比它小, 右边的元素比它大

"""

print(np.partition(arr, 3)) # [15 13 10 19 27 33 66]

# 第4小的元素(排完序之后索引为3)显然是19, 那么将19放在索引为3的位置, 然后左边的元素比它小, 右边的元素比它大

# 至于两边的顺序则没有要求

# 虽然我们可以使用sort, 但是sort是全局排序

# 如果数组非常大, 我们只希望选择最小的10个元素, 直接通过np.partition(arr, 9)即可

# 然后如果排序的话, 只对这选出来的10个元素排序即可, 而无需对整个大数组进行排序

# 同理还可以从后往前找, 比如:

# np.partition(arr, -2)表示找到第2大的元素(将arr排序之后索引-2的元素), 放在数组索引为-2的地方

# 然后左边元素比它小, 右边元素比它大

print(np.partition(arr, -2)) # [13 10 27 15 19 33 66]

# 第2大的元素显然是33, 那么排在索引为-2的位置, 左边元素比它小, 右边元素比它大

# 然后argpartition不用想, 肯定是获取排序之后的索引

print(np.argpartition(arr, 3)) # [1 5 6 4 2 3 0]

print(np.argpartition(arr, -2)) # [5 6 2 1 4 3 0]

python中argmin函数_numpy中的argmax、argmin、argwhere、argsort、argpartition函数相关推荐

  1. python transpose函数_numpy中transpose和swapaxes函数讲解

    1 transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数. 我们看如下一个numpy的数组: arr=np.arange(16).reshape( ...

  2. python中的np array函数_numpy中的np.ascontiguousarray()函数

    "Return a contiguous array (ndim >= 1) in memory (C order)." 用途 ascontiguousarray函数将一个内 ...

  3. python linspace函数_numpy中linspace用法

    linspace的功能最初是从MATLAB中学来的,用此来创建等差数列.近期用Python的时候发现也有这个功能,提供相应功能的是numpy.关于MATLAB中的功能就不再进行赘述了,接下来把我可能用 ...

  4. python中grid函数_numpy中的meshgrid函数的使用

    meshgrid(*xi, **kwargs) 功能:从一个坐标向量中返回一个坐标矩阵 参数: x1,x2...,xn:数组,一维的数组代表网格的坐标. indexing:{'xy','ij'},笛卡 ...

  5. python中transpose函数_numpy中的transpose函数使用方法

    二维矩阵的transpose函数: 不晓得该怎么起头,直接上干货. transpose()简单来说,就相当于数学中的转置,在矩阵中,转置就是把行与列相互调换位置: 例如:随机生成一个三行五列的二维矩阵 ...

  6. matlab reshape函数_numpy中的np.ascontiguousarray()函数

    Numpy文档中的说明: "Return a contiguous array (ndim >= 1) in memory (C order)." 用途 ascontiguo ...

  7. python读取sav文件_Numpy中数据的常用的保存与读取方法

    小书匠 深度学习 文章目录: 在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多. 下面就常用的保存数据到 ...

  8. python矩阵和向量乘积_NumPy 中的矩阵和向量

    NumPy 中的矩阵和向量 numpy的 ndarray 类用于表示矩阵和向量. 要在numpy中构造矩阵,我们在列表中列出矩阵的行, 并将该列表传递给numpy数组构造函数. 例如,构造与矩阵对应的 ...

  9. python numpy矩阵索引_Numpy中的矩阵索引

    索引后查看形状:In [295]: A=np.matrix([1,2,3]) In [296]: A.shape Out[296]: (1, 3) In [297]: A[0] Out[297]: m ...

最新文章

  1. log4j超详细讲解
  2. dns服务器在电脑上有什么作用,DNS服务器是什么 DNS服务器的作用有哪些【详解】...
  3. 清华硕士一针见血:这些才是机器学习必备的数学基础
  4. 单实例activemq 数据测试
  5. PHP设计模式——状态模式
  6. java报错stderr_struts2 文件上传路径错误 ERROR [STDERR] java.io.FileNotFoundException:
  7. 蓝桥杯真题-单词分析
  8. 计算机微积分基础试题及答案,试题及答案_基础微积分Ⅱ_大学网课答案
  9. 多个panel控件重合使用时,某个panel控件不显示问题?
  10. 对于C语言中的指针**P的理解,C语言指针**p是什么意思
  11. python存储数据到mysql--针对dataframe格式下的
  12. OpenTCS打造移动机器人交通管制系统(三)
  13. undefined是什么意思啊
  14. MODULE_AUTHOR 功能
  15. 使用Ruby搭建Redis 集群
  16. CF949D Curfew solution
  17. 使用网络图展示Venn图集合及Cytoscape操作视频
  18. 四个小故事—体验经济:互联网生存的秘密
  19. OpenGL超级宝典笔记——光照参数与材料属性
  20. Unity 给物体加贴图

热门文章

  1. 软件测试 | App常见bug解析
  2. vsnprintf函数使用
  3. liquibase常见操作
  4. Tomcat启动闪退问题解决
  5. linux 汇编 cmp,使用汇编语言编写C程序的函数
  6. Android常用框架总结
  7. Visual Studio编译时 error LINK
  8. Sql Server 2019 详细安装教程
  9. 申请网络文化经营许可证《文网文》会遇到哪些问题?
  10. 单片机智能遥控小车实战