Python np.argmin()和np.argmax()函数
按照axis的要求返回最小的数/最大的数的下标
1
2
|
numpy.argmin(a, axis = None , out = None )
numpy.argmax(a, axis = None , out = None )
|
a
:传入一个数组,
axis
:默认将输入数组展平,否则,按照axis方向
out
:可选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import numpy as np
a = np.arange( 6 ).reshape( 2 , 3 )
a
array([[ 0 , 1 , 2 ],
[ 3 , 4 , 5 ]])
# 此时自动展平了
np.argmin(a)
0
np.argmax(a)
5
# 在axis方向上找最小的值并返回坐标
np.argmin(a, axis = 1 )
array([ 0 , 0 ], dtype = int64)
# 在axis方向上找最大的值并返回坐标
np.argmax(a, axis = 1 )
array([ 2 , 2 ], dtype = int64)
|
当有多个最小值的时候只显示第一个
1
2
3
4
5
6
7
8
|
a = np.arange( 6 )
a[ 4 ] = 0
a
array([ 0 , 1 , 2 , 3 , 0 , 5 ])
np.argmin(a)
0
|
Python基础——min/max与np.argmin/np.argmax
这里应该是拿min/max(更适合处理可迭代对象,可选的参数是key=func)与np.min/np.max(可适合处理numpy.ndarray对象,可选的参数是axis=0或者1)作比较,只不过np.argmin/np.argmax的用法与np.min/np.max相似,这里就不进行更正了。
首先min/max与np.argmin/np.argmax函数的功能不同
前者返回值,后者返回最值所在的索引(下标)
处理的对象不同
前者跟适合处理list等可迭代对象,而后者自然是numpy里的核心数据结构ndarray(多维数组)
min/max是python内置的函数
np.argmin/np.argmax是numpy库中的成员函数
接口不同
1
2
|
min (iterable, key = func) - >value
np.argmin(a, axis = None )
|
常见的接口如上所示,前者除了一个可迭代对象外,还接收一个函数对象(keyword argument),用于指定比较的对象(也即最值比较的内容是,将迭代对象中的元素逐个赋予func函数对象所得到返回值),可见func只可接受一个参数,如min(dict, key=dict.get)。
而np.argmax更多的是进行轴上的比较(axis=0,也是默认的轴,是列向)
1
2
3
4
5
6
7
8
9
10
|
>>> l = [ '1' , '100' , '111' , '2' ]
>>> max (l)
'2'
# 下面我们指定比较内容
>>> max (l, key = lambda x: int (x)
'111'
>>> max (l, key = lambda x: len (x))
'100'
>>> max (l, key = lambda x: len (x) and int (x))
'111'
|
我们也可将min/max作用于list of lists(这里不对tuple和list作区分):
1
2
|
>>> ll = [( 1 , 'a' ), ( 3 , 'c' ), ( 4 , 'e' ), ( - 1 , 'z' )]
>>> max (ll)
|
例如根据列表中的每一个元素(tuple或者list类型)的第二位进行求最大值:
1
2
3
4
5
|
>>> l = [( 1 , 2 , 5 ), ( 2 , 3 , 5 ), ( 3 , 2 , 5 ), ( 4 , 4 , 5 ), ( 5 , 1 , 5 )]
>>> max (l, key = lambda x: x[ 1 ])
( 4 , 4 , 5 )
>>> l.index( max (l, key = lambda x: x[ 1 ]))
3
|
默认情况下,max首先进行比较的是items(k,v)中的第一个内容(也即是k),相等的情况下,再进行v的比较。
稍作修改,我们便可实现对v的比较:
1
2
|
>>> max (ll, key = lambda x: x[ 1 ])
( - 1 , 'z' )
|
有时可能最值所在的下标对我们更重要,我们据此下标索引更为丰富的信息。如何不显式转化为numpy.ndarray类型(有时也无法转换,当异质容器时)不通过np.argmax这样的函数获得最值(任何值都可以)所在的下标呢?使用list(tuple)的index()成员函数。
1
2
3
4
|
>>> ll = [( 1 , 'a' ), ( 3 , 'c' ), ( 4 , 'e' ), ( - 1 , 'z' )]
>>> val = max (ll, lambda x: x[ 1 ])
>>> ll.index(val)
3
|
根据以上用法,我们也可推测并实现一个精简版的max函数:
1
2
3
4
5
6
|
def max (items, key = lambda x: x):
current = items[ 0 ]
for item in items:
if key(item) > key(current):
current = item
return current
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://hnuysylps.blog.csdn.net/article/details/103190408