python之np.argmax()及对axis=0或者1的理解
对于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))numpy教程pdf
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代表着⾏查。
>>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表⽰每⼀⾏的最⼤值的索引。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论