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使用gensim计算文档相似性
Apr 10 Python
python 实现tar文件压缩解压的实例详解
Aug 20 Python
python中logging包的使用总结
Feb 28 Python
python 判断网络连通的实现方法
Apr 22 Python
基于Python log 的正确打开方式
Apr 28 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
Jan 15 Python
Python学习笔记之视频人脸检测识别实例教程
Mar 06 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 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/11/26 PHP
php中require和require_once的区别说明
2014/02/27 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Scrapy框架使用的基本知识
2018/10/21 Python
python如何实现单链表的反转
2020/02/10 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
自动化专业本科毕业生求职信
2013/10/20 职场文书
生产部岗位职责范文
2014/02/07 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
大学新闻系自荐书
2014/05/31 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
无工作证明怎么写
2015/06/15 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
HAM-2000摩机图
2021/04/22 无线电
python中validators库的使用方法详解
2022/09/23 Python