深入理解numpy中argmax的具体使用

星野
星野
发布时间:2026-10-12 | 3人浏览过
原创

本文详细解析numpy库中argmax函数的用法,重点阐述axis参数在一维、二维及三维数组中的行为差异。通过具体代码示例,说明如何指定轴方向以获取最大值的索引,涵盖从基础拉平操作到多维通道比较的完整场景,帮助开发者准确掌握高维数据处理技巧。

一、基本介绍

numpy中的argmax函数用于返回数组中最大值的索引位置。当调用np.argmax(axis)时,axis参数的指定往往容易令人困惑。简单来说,axis参数允许我们从行、列或深度等不同维度方向来审视高维数组,从而确定最大值所在的索引。

二、代码实验

1、一维数组情况

对于简单的一维数组,直接调用np.argmax()即可返回最大值的索引。若不指定axis参数,其效果等同于将数组展平后寻找最大值的索引。

1.1、axis=0

当指定axis=0时,实际上是在列方向上进行比较,寻找具有最大值的行的索引。

然而,对于一维数组而言,这一指定并没有产生额外影响。

1.2、axis=1

当指定axis=1时,程序会报错。这是因为变量a是一维数组,不存在axis=1这一轴。这表明在使用np.argmax()时,指定的axis不能超过数组实际的维度数。

2、二维数组情况

如果不指定axis,相当于将二维数组展平,直接选取最大值的索引。

2.1、axis=0

指定axis=0意味着按列进行比较,返回行索引中的最大值。

我们修改b中的元素,期望得到的结果是[2,2,1,2]。

实际运行结果与我们的预期相符。

2.2、axis=1

指定axis=0这里原文有误,结合上下文应为指定axis=1时,意味着按行进行比较,返回列索引中的最大值。

3、三维数组情况

一个三维数组可以视为一张图片,其三个维度分别为(high, width, channels),分别表示图像的高、宽和通道数(深度)。常见的彩色图像包含三个通道,我们以常见的RGB图像为例构建数组。

直接调用np.argmax(),相当于将三维数组展平,寻找最大值的索引。

3.1、axis=0

单独查看c的三个通道数据,如图所示。

对于三个通道取axis=0,意味着分别比较列,返回行的最大值索引。

我们期望的返回值应该是[[1,1,1,],[1,1,1],[1,1,1]],实际结果与我们的预期一致。

3.2、axis=1

对于三个通道取axis=1,意味着分别比较行,返回列的最大值索引。

我们期望的结果是[[2, 2, 2],[2, 2, 2],[2, 2, 2],[2, 2, 2]],,实际结果与我们的预期一致。

3.3、axis=2

取axis=2意味着从图像的深度方向(通道方向)进行比较。可以认为三个数组叠在一起,分别对应channel0,channel1,channel2,而我们取最大值的索引就是返回对应像素所在的通道索引。

c的channel2所有像素值均大于其他两个channel,所有返回值应该是[[2,2,2,],[2,2,2,],[2,2,2,],[2,2,2,]],实际结果与我的预期一致。

3.4、axis=-1

axis=-1即是从反方向看轴,对于三维情况axis=-1和axis=2一致。

其他补充: 对于二维情况axis=-1和anxis=1一致 对于一维情况axis=0和anxis=-1一致

四、Reference

https://blog.csdn.net/weixin_39190382/article/details/105854567

https://www.cnblogs.com/zhouyang209117/p/6512302.html

PS:补充

1.对一个一维向量

import numpy as np
a = np.array([3, 1, 2, 4, 6, 1])
b=np.argmax(a)#取出a中元素最大值所对应的索引,此时最大值位6,其对应的位置索引值为4,(索引值默认从0开始)
print(b)#4

2.对2维向量(通常意义下的矩阵)a[][]

import numpy as np
a = np.array([[1, 5, 5, 2],
              [9, 6, 2, 8],
              [3, 7, 9, 1]])
b=np.argmax(a, axis=0)#对二维矩阵来讲a[0][1]会有两个索引方向,第一个方向为a[0],默认按列方向搜索最大值
#a的第一列为1,9,3,最大值为9,所在位置为1,
#a的第一列为5,6,7,最大值为7,所在位置为2,
#此此类推,因为a有4列,所以得到的b为1行4列,
print(b)#[1 2 2 1]
 
c=np.argmax(a, axis=1)#现在按照a[0][1]中的a[1]方向,即行方向搜索最大值,
#a的第一行为1,5,5,2,最大值为5(虽然有2个5,但取第一个5所在的位置),索引值为1,
#a的第2行为9,6,2,8,最大值为9,索引值为0,
#因为a有3行,所以得到的c有3个值,即为1行3列
print(c)#[1 0 2]

3.对于三维矩阵a[0][1][2],情况最为复杂,但在lstm中应用最广

import numpy as np
a = np.array([
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ],
 
              [
                  [-1, 7, -5, 2],
                  [9, 6, 2, 8],
                  [3, 7, 9, 1]
              ],
            [
                  [21, 6, -5, 2],
                  [9, 36, 2, 8],
                  [3, 7, 79, 1]
              ]
            ])
b=np.argmax(a, axis=0)#对于三维度矩阵,a有三个方向a[0][1][2]
#当axis=0时,是在a[0]方向上找最大值,即两个矩阵做比较,具体
#(1)比较3个矩阵的第一行,即拿[1, 5, 5, 2],
#                         [-1, 7, -5, 2],
#                         [21, 6, -5, 2],
#再比较每一列的最大值在那个矩阵中,可以看出第一列1,-2,21最大值为21,在第三个矩阵中,索引值为2
#第2列5,7,6最大值为7,在第2个矩阵中,索引值为1.....,最终得出比较结果[2 1 0 0]
#再拿出三个矩阵的第二行,按照上述方法,得出比较结果 [0 2 0 0]
#一共有三个,所以最终得到的结果b就为3行4列矩阵
print(b)
#[[0 0 0 0]
 #[0 1 0 0]
 #[1 0 1 0]]
 
c=np.argmax(a, axis=1)#对于三维度矩阵,a有三个方向a[0][1][2]
#当axis=1时,是在a[1]方向上找最大值,即在列方向比较,此时就是指在每个矩阵内部的列方向上进行比较
#(1)看第一个矩阵
                  # [1, 5, 5, 2],
                  # [9, -6, 2, 8],
                  # [-3, 7, -9, 1]
#比较每一列的最大值,可以看出第一列1,9,-3最大值为9,,索引值为1
#第2列5,-6,7最大值为7,,索引值为2
# 因此对第一个矩阵,找出索引结果为[1,2,0,1]
#再拿出2个,按照上述方法,得出比较结果 [1 0 2 1]
#一共有三个,所以最终得到的结果b就为3行4列矩阵
print(c)
#[[1 2 0 1]
 # [1 0 2 1]
 # [0 1 2 1]]
 
d=np.argmax(a, axis=2)#对于三维度矩阵,a有三个方向a[0][1][2]
#当axis=2时,是在a[2]方向上找最大值,即在行方向比较,此时就是指在每个矩阵内部的行方向上进行比较
#(1)看第一个矩阵
                  # [1, 5, 5, 2],
                  # [9, -6, 2, 8],
                  # [-3, 7, -9, 1]
#寻找第一行的最大值,可以看出第一行[1, 5, 5, 2]最大值为5,,索引值为1
#第2行[9, -6, 2, 8],最大值为9,,索引值为0
# 因此对第一个矩阵,找出行最大索引结果为[1,0,1]
#再拿出2个矩阵,按照上述方法,得出比较结果 [1 0 2 1]
#一共有三个,所以最终得到的结果d就为3行3列矩阵
print(d)
# [[1 0 1]
#  [1 0 2]
#  [0 1 2]]
###################################################################
#最后一种情况,指定矩阵a[0, -1, :],第一个数字0代表取出第一个矩阵(从前面可以看出a有3个矩阵)为
# [1, 5, 5, 2],
# [9, -6, 2, 8],
# [-3, 7, -9, 1]
#第二个数字“-1”代表拿出倒数第一行,为
# [-3, 7, -9, 1]
#这一行的最大索引值为1
 
# ,-1,代表最后一行
m=np.argmax(a[0, -1, :])
print(m)#1
 
#h,取a的第2个矩阵
# [-1, 7, -5, 2],
# [9, 6, 2, 8],
# [3, 7, 9, 1]
#的第3行
# [3, 7, 9, 1]
#的最大值为9,索引为2
h=np.argmax(a[1, 2, :])
print(h)#2
 
g=np.argmax(a[1,:, 2])#g,取出矩阵a,第2个矩阵的第3列为-5,2,9,最大值为9,索引为2
print(g)#2

到此这篇关于深入理解numpy中argmax的具体使用的文章就介绍到这了,更多相关numpy argmax内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表