Pythonでargmaxをどのように実装する必要がありますか?可能な限り効率的である必要があるため、反復可能で機能する必要があります。
それを実装できる3つの方法:
- ペアの反復可能が与えられると、最大値に対応するキーを返します
- 反復可能な値が与えられると、最大値のインデックスを返します
- 反復可能なキーと関数が与えられた場合
f
、最大のキーを返しますf(key)
私が見つけた最良の解決策を修正しました:
# given an iterable of pairs return the key corresponding to the greatest value
def argmax(pairs):
return max(pairs, key=lambda x: x[1])[0]
# given an iterable of values return the index of the greatest value
def argmax_index(values):
return argmax(enumerate(values))
# given an iterable of keys and a function f, return the key with largest f(key)
def argmax_f(keys, f):
return max(keys, key=f)
次のコードは高速で Pythonic な方法ですか?
idx_max = max(enumerate(x), key=lambda x:x[1])[0]
この方法で argmax を考えるのが簡単であることがわかりました。たとえば、 からのアイテムがargmax(f(y))
どこにあるかを計算したいとします。したがって、それぞれについて計算して maximumを取得します。y
Y
y
f(y)
y
f(y)
この argmax の定義は一般的なものであり、「反復可能な値が最大値のインデックスを返す」とは異なります (また、非常に自然な IMHO です)。
そして..ドラムロール.. Python では、組み込みの を使用して正確にこれを行うことができますmax
:
best_y = max(Y, key=f)
したがってargmax_f
、(受け入れられた回答から)不必要に複雑で非効率的なIMHOです-これは組み込みの複雑なバージョンですmax
。他のすべての argmax のようなタスクは、この時点で明らかになるはずです: 適切な関数を定義するだけf
です。
def argmax(lst):
return lst.index(max(lst))
または同様に:
argmax = lambda lst: lst.index(max(lst)
Neil の回答に基づいていますが、複数の引数を取る関数に特化しています。
argmax = lambda keys, func: max(imap(lambda key: (func(*key), key), keys))[1]
例えば:
argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)