python之np.argmax()及对axis=0或者1的理解


Posted in Python onJune 02, 2021

对于np.argmax()让我迷惑了很久,尤其是其中的axis=1的比较结果。

一、np.argmax()的理解

1、最简单的例子

假定现在有一个数组a = [3, 1, 2, 4, 6, 1]现在要算数组a中最大数的索引是多少。最直接的思路,先假定第0个数最大,然后拿这个和后面的数比,找到大的就更新索引。代码如下

a = [3, 1, 2, 4, 6, 1]
maxindex = 0
i = 0
for tmp in a:
    if tmp > a[maxindex]:
        maxindex = i
    i += 1
print(maxindex)

这个问题可以帮助我们理解argmax.

2、函数的解释

一维数组

import numpy as np
a = np.array([3, 1, 2, 4, 6, 1])
print(np.argmax(a))

argmax返回的是最大数的索引.argmax有一个参数axis,默认是0,表示第几维的最大值。

二维数组

import numpy as np
a = np.array([[1, 5, 5, 2],
              [9, 6, 2, 8],
              [3, 7, 9, 1]])
print(np.argmax(a, axis=0))

为了描述方便,a就表示这个二维数组。np.argmax(a, axis=0)的含义是a[0][j],a[1][j],a[2]j中最大值的索引。从a[0][j]开始,最大值索引最初为(0,0,0,0),拿a[0][j]和a[1][j]作比较,9大于1,6大于5,8大于2,所以最大值索引由(0,0,0,0)更新为(1,1,0,1),再和a[2][j]作比较,7大于6,9大于5所以更新为(1,2,2,1)。

再分析下面的输出.

import numpy as np
a = np.array([[1, 5, 5, 2],
              [9, 6, 2, 8],
              [3, 7, 9, 1]])
print(np.argmax(a, axis=1))

np.argmax(a, axis=1)的含义是a[i][0],a[i][1],a[i][2],a[i]3中最大值的索引。从a[i][0]开始,a[i][0]对应的索引为(0,0,0),先假定它就是最大值索引(思路和上节简单例子完全一致)拿a[i][0]和a[i][1]作比较,5大于1,7大于3所以最大值索引由(0,0,0)更新为(1,0,1),再和a[i][2]作比较,9大于7,更新为(1,0,2),再和a[i][3]作比较,不用更新,最终值为(1,0,2)

三维数组

import numpy as np
a = np.array([
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ],

              [
                  [-1, 5, -5, 2],
                  [9, 6, 2, 8],
                  [3, 7, 9, 1]
              ]
            ])
print(np.argmax(a, axis=0))

np.argmax(a, axis=0)的含义是a[0][j][k],a[1][j][k] (j=0,1,2,k=0,1,2,3)中最大值的索引。

从a[0][j][k]开始,a[0][j][k]对应的索引为((0,0,0,0),(0,0,0,0),(0,0,0,0)),拿a[0][j][k]和a[1][j][k]对应项作比较6大于-6,3大于-3,9大于-9,所以更新这几个位置的索引,将((0,0,0,0),(0,0,0,0),(0,0,0,0))更新为((0,0,0,0),(0,1,0,0),(1,0,1,0)).。

再看axis=1的情况

import numpy as np
a = np.array([
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ],

              [
                  [-1, 5, -5, 2],
                  [9, 6, 2, 8],
                  [3, 7, 9, 1]
              ]
            ])
print(np.argmax(a, axis=1))

np.argmax(a, axis=1)的含义是a[i][0][k],a[i][1][k] (i=0,1,k=0,1,2,3)中最大值的索引。从a[i][0][k]开始,a[i][0][k]对应的索引为((0,0,0,0),(0,0,0,0)),拿a[i][0][k]和a[i][1][k]对应项作比较,9大于1,8大于2,9大于-1,6大于5,2大于-5,8大于2,所以更新这几个位置的索引,将((0,0,0,0),(0,0,0,0))更新为((1,0,0,1),(1,1,1,1)),现在最大值对应的数组为((9,5,5,8),(9,6,2,8))。

再拿((9,5,5,8),(9,6,2,8))和a[i][2][k]对应项从比较,7大于5,7大于6,9大于2.更新这几个位置的索引。

将((1,0,0,1),(1,1,1,1))更新为((1,2,0,1),(1,2,2,1)).axis=2的情况也是类似的。

二、关于axis的理解

设置axis的主要原因是方便我们进行多个维度的计算。

通过例子来进行理解

比如:

a = np.array([[1, 2, 3], 
     [2, 3, 4], 
     [5, 4, 3], 
     [8, 7, 2]])
np.argmax(a, 0)   #输出:array([3, 3, 1]
np.argmax(a, 1)   #输出:array([2, 2, 0, 0]

axis = 0:

你就这么想,0是最大的范围,所有的数组都要进行比较,只是比较的是这些数组相同位置上的数(我的理解是0 列比较输出):

a[0] = array([1, 2, 3])
a[1] = array([2, 3, 4])
a[2] = array([5, 4, 3])
a[3] = array([8, 7, 2])
# output : [3, 3, 1]

axis = 1: (行比较输出)

等于1的时候,比较范围缩小了,只会比较每个数组内的数的大小,结果也会根据有几个数组,产生几个结果。

a[0] = array([1, 2, 3]) #2
a[1] = array([2, 3, 4]) #2
a[2] = array([5, 4, 3]) #0
a[3] = array([8, 7, 2]) #0

特例

这是里面都是数组长度一致的情况,如果不一致,axis最大值为最小的数组长度-1,超过则报错。

当不一致的时候,axis=0的比较也就变成了每个数组的和的比较。

比较示例如下

当数组长度都一样时

import numpy as np
a = np.array([
              [
                  [1, 5, 5, 2],
                  [9, -6, 2, 8],
                  [-3, 7, -9, 1]
              ],

              [
                  [-1, 5, -5, 2],
                  [9, 6, 2, 8],
                  [3, 7, 9,1]
              ]
            ])
print(np.argmax(a, axis=0))
print(np.argmax(a, axis=1))

输出为

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

[1 2 2 1]]

当数组长度都不一样时,

a = np.array([
                  [
                      [1, 5, 5, 2],
                      [9, -6, 2, 8],
                      [-3, 7, -9, 1]
                  ],
    
                  [
                      [-1, 5, -5, 2],
                      [9, 6, 2, 8],
                      [3, 7, 9]
                  ]
                ])
    print(np.argmax(a, axis=0))
 print(np.argmax(a, axis=1))

输出为

[0 1 1]
[1 1]

numpy 的argmax的参数axis=0/1的概念

对numpy的argmax一直记不得默认是行还是列搜索,总是用糊涂,每次都要查资料,今天突然醒悟。

先列后行,为什么呢?

看下面的一个列表,就知道了。

>>b=np.array([1, 2, 3, 4, 3, 2, 1])
>>np.argmax(b)
>>3
>>np.argmax(b, axis=0)
>>3

默认axis=0,列表只有一个维度,自然就是一行数据的最大数的索引。

那么对于二维向量,只需要记住axis是坐标轴的方向,不是行列的概念。

在Numpy库中:

轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:

第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across)。

所以axis=0代表的就是列查找,axis=1代表着行查找。

python之np.argmax()及对axis=0或者1的理解

>>a = np.array([[1, 5, 5, 2],
               [9, 6, 2, 8],
               [3, 7, 9, 1]])
>>np.argmax(a,axis=0)
>>array([1, 2, 2, 1], dtype=int64)
>>np.argmax(a,axis=1)
>>array([1, 0, 2], dtype=int64)

结论:

argmax返回的是最大数的索引。argmax有一个参数axis,默认是0,表示每一列的最大值的索引,axis=1表示每一行的最大值的索引。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基础之函数用法实例详解
Sep 10 Python
Python将xml和xsl转换为html的方法
Mar 10 Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 Python
Python制作钉钉加密/解密工具
Dec 07 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
Python 实现网页自动截图的示例讲解
May 17 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
Python创建或生成列表的操作方法
Jun 19 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
Python 如何定义匿名或内联函数
Aug 01 Python
Python import模块的缓存问题解决方案
Jun 02 #Python
Python3 类型标注支持操作
Jun 02 #Python
python 实现两个变量值进行交换的n种操作
聊聊Python中关于a=[[]]*3的反思
python内置进制转换函数的操作
Jun 02 #Python
Python 内置函数速查表一览
Jun 02 #Python
利用Python判断你的密码难度等级
Jun 02 #Python
You might like
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
js实时获取并显示当前时间的方法
2015/07/31 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
python使用代理ip访问网站的实例
2018/05/07 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
django_orm查询性能优化方法
2018/08/20 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
园长自我鉴定
2013/10/06 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
投标保密承诺书
2014/05/19 职场文书
老人节主持词
2015/07/04 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python