Python np.argmin()和np.argmax()函數
按照axis的要求返回最小的數/最大的數的下標
numpy.argmin(a, axis=None, out=None) numpy.argmax(a, axis=None, out=None)
a
:傳入一個數組,
axis
:默認將輸入數組展平,否則,按照axis方向
out
:可選
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)
當有多個最小值的時候隻顯示第一個
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庫中的成員函數
接口不同
min(iterable, key=func)->value np.argmin(a, axis=None)
常見的接口如上所示,前者除瞭一個可迭代對象外,還接收一個函數對象(keyword argument),用於指定比較的對象(也即最值比較的內容是,將迭代對象中的元素逐個賦予func函數對象所得到返回值),可見func隻可接受一個參數,如min(dict, key=dict.get)。
而np.argmax更多的是進行軸上的比較(axis=0,也是默認的軸,是列向)
>>> 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作區分):
>>> ll = [(1, 'a'), (3, 'c'), (4, 'e'), (-1, 'z')] >>> max(ll)
例如根據列表中的每一個元素(tuple或者list類型)的第二位進行求最大值:
>>> 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的比較:
>>> max(ll, key=lambda x: x[1]) (-1, 'z')
有時可能最值所在的下標對我們更重要,我們據此下標索引更為豐富的信息。如何不顯式轉化為numpy.ndarray類型(有時也無法轉換,當異質容器時)不通過np.argmax這樣的函數獲得最值(任何值都可以)所在的下標呢?使用list(tuple)的index()成員函數。
>>> ll = [(1, 'a'), (3, 'c'), (4, 'e'), (-1, 'z')] >>> val = max(ll, lambda x: x[1]) >>> ll.index(val) 3
根據以上用法,我們也可推測並實現一個精簡版的max函數:
def max(items, key=lambda x: x): current = items[0] for item in items: if key(item) > key(current): current = item return current
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支援。