1 python數據分析numpy基礎之argmax求數組最大值索引
python的numpy庫的argmax()函數,用于獲取沿指定軸的最大值的索引。
用法
numpy.argmax(a, axis=None, out=None, *, keepdims=<no value>)
描述
argmax()返回沿指定軸的最大值的索引。
入參axis表示指定軸,默認為None表示整個數組的最大值的索引而不是某個軸的最大值索引,即轉為一維數組后的最大值的索引。axis只能為整數,不支持整數元組。
入參keepdims表示是否保留指定軸的尺寸為1,默認為False,不保留。
1.1 入參a
numpy.argmax()的入參a,為必選入參,可以為數組、列表、元組。
>>> import numpy as np
# 入參a為列表
>>> np.argmax([-5,-10,0,1,5,39,2])
5
# 入參a為元組
>>> np.argmax((-5,-10,0,1,5,39,2))
5
# 入參a為數組
>>> np.argmax(np.array((-5,-10,0,1,5,39,2)))
5
1.2 入參axis為整數
numpy.argmax()的入參axis為可選入參,只能為整數(不支持元組),范圍[0, ndim),默認為None,表示求整個數組的最大值的索引,若為多維數組則轉換為一維數組來獲取最大值的索引。
若axis=n為整數,則對沿指定軸n的元素求最大值的索引,并且只返回指定軸的索引,其他軸索引不返回。
若axis=負數,則-1對應最后一個軸,-2倒數第2個軸,依此類推。
最大值多次出現時,argmax()返回第一次出現的索引。
np.ndindex(ar3.shape) 獲取指定形狀數組的索引迭代器對象,遍歷迭代器索引獲取數組元素。
>>> import numpy as np
>>> ar3=np.array([[[12, 13, 8, 15 ],[ 19, 25, 16, 5],[ 18, 29, 10, 31]],[[9, 11, 21, 3],[16, 17, 31, 19],[20, 3, 22, 23]]])
# axis默認為None,返回整個數組的最大值的索引
>>> np.argmax(ar3)
11
# ar3最大值為31
>>> np.max(ar3)
31
# axis=None時,ar3相當于一維數組
>>> ar3.reshape(ar3.size)
array([12, 13, 8, 15, 19, 25, 16, 5, 18, 29, 10, 31, 9, 11, 21, 3, 16,17, 31, 19, 20, 3, 22, 23])
# 最大值多次出現時,返回第一次出現的索引
# 索引為11的值為最大值31,為第一次出現的索引,索引argmax()返回15
>>> ar3.reshape(ar3.size)[11]
31
# 索引為18的值為最大值31
>>> ar3.reshape(ar3.size)[18]
31
# np.ndindex(ar3.shape) 獲取指定形狀數組的索引迭代器對象
>>> ar3vis=[str(ar3[i])+str(i) for i in np.ndindex(ar3.shape)]
>>> ar3vi=np.array(ar3vi).reshape(ar3.shape)
# 獲取ar3數組和其索引
# n維數組由n個軸的索引組成
# 比如三維數組索引(1, 0, 0),分別表示0/1/2軸的索引
>>> ar3vi
array([[['12(0, 0, 0)', '13(0, 0, 1)', '8(0, 0, 2)', '15(0, 0, 3)'],['19(0, 1, 0)', '25(0, 1, 1)', '16(0, 1, 2)', '5(0, 1, 3)'],['18(0, 2, 0)', '29(0, 2, 1)', '10(0, 2, 2)', '31(0, 2, 3)']],[['9(1, 0, 0)', '11(1, 0, 1)', '21(1, 0, 2)', '3(1, 0, 3)'],['16(1, 1, 0)', '17(1, 1, 1)', '18(1, 1, 2)', '19(1, 1, 3)'],['20(1, 2, 0)', '3(1, 2, 1)', '22(1, 2, 2)', '23(1, 2, 3)']]],dtype='<U11')
# axis=0,只返回沿0軸最大值的索引,0軸大小為2,索引只有0,1
>>> np.argmax(ar3,axis=0)
array([[0, 0, 1, 0],[0, 0, 1, 1],[1, 0, 1, 0]], dtype=int64)
# max()獲取0軸最大值,argmax()獲取0軸最大值的索引
# 比如20的索引為(1, 2, 0),取0軸索引1
>>> np.max(ar3,axis=0)
array([[12, 13, 21, 15],[19, 25, 31, 19],[20, 29, 22, 31]])
# axis=1,只返回沿1軸最大值的索引,1軸大小為3,索引只有0,1,2
>>> np.argmax(ar3,axis=1)
array([[1, 2, 1, 2],[2, 1, 1, 2]], dtype=int64)
# 比如29(0, 2, 1),取1軸索引2
>>> np.max(ar3,axis=1)
array([[19, 29, 16, 31],[20, 17, 31, 23]])
# axis=2,只返回沿2軸最大值的索引,2軸大小為4,索引只有0,1,2,3
>>> np.argmax(ar3,axis=2)
array([[3, 1, 3],[2, 2, 3]], dtype=int64)
# 比如 23(1, 2, 3)),取2軸索引3
>>> np.max(ar3,axis=2)
array([[15, 25, 31],[21, 31, 23]])
# axis=負數,則-1對應最后一個軸,-2倒數第2個軸,依此類推。
>>> np.argmax(ar3,axis=-1)
array([[3, 1, 3],[2, 2, 3]], dtype=int64)
1.3 入參keepdims
numpy.argmax()的入參keepdims為可選入參,只能為False或True,默認為False。
keepdims為False則不保留指定軸的尺寸,即返回最大值索引的數組形狀,不包括指定軸。
keepdims為True則保留指定軸的持倉為1,即返回最大值索引的數組形狀,包括指定軸且大小為1。
>>> import numpy as np
>>> ar3=np.array([[[12, 13, 8, 15 ],[ 19, 25, 16, 5],[ 18, 29, 10, 31]],[[9, 11, 21, 3],[16, 17, 31, 19],[20, 3, 22, 23]]])
>>> kdnt=np.argmax(ar3,keepdims=True)
>>> kdnf=np.argmax(ar3,keepdims=False)
>>> kdn=np.argmax(ar3)
# keepdims=True,最大值索引數組,保留指定軸,且尺寸為1
>>> kdnt.shape,kdnt.ndim
((1, 1, 1), 3)
# keepdims=False,最大值索引數組,刪除指定軸
>>> kdnf.shape,kdnf.ndim
((), 0)
# keepdims默認False,最大值索引數組,刪除指定軸
>>> kdn.shape,kdn.ndim
((), 0)
>>> kdnt,kdnf,kdn
(array([[[11]]], dtype=int64), 11, 11)
>>> kd0t=np.argmax(ar3,axis=0,keepdims=True)
>>> kd0=np.argmax(ar3,axis=0)
# True保留axis=0且尺寸為1
>>> kd0t.shape,kd0t.ndim
((1, 3, 4), 3)
# False刪除axis=0
>>> kd0.shape,kd0.ndim
((3, 4), 2)
>>> kd0t
array([[[0, 0, 1, 0],[0, 0, 1, 1],[1, 0, 1, 0]]], dtype=int64)
>>> kd0
array([[0, 0, 1, 0],[0, 0, 1, 1],[1, 0, 1, 0]], dtype=int64)
>>> kd1t=np.argmax(ar3,axis=1,keepdims=True)
>>> kd1=np.argmax(ar3,axis=1)
# True保留axis=1且尺寸為1
>>> kd1t.shape,kd1t.ndim
((2, 1, 4), 3)
# False刪除axis=1
>>> kd1.shape,kd1.ndim
((2, 4), 2)
>>> kd1t
array([[[1, 2, 1, 2]],[[2, 1, 1, 2]]], dtype=int64)
>>> kd1
array([[1, 2, 1, 2],[2, 1, 1, 2]], dtype=int64)