25

Pythonでargmaxをどのように実装する必要がありますか?可能な限り効率的である必要があるため、反復可能で機能する必要があります。

それを実装できる3つの方法:

  • ペアの反復可能が与えられると、最大値に対応するキーを返します
  • 反復可能な値が与えられると、最大値のインデックスを返します
  • 反復可能なキーと関数が与えられた場合f、最大のキーを返しますf(key)
4

5 に答える 5

30

私が見つけた最良の解決策を修正しました:

# 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)
于 2011-02-23T23:23:38.437 に答える
21

次のコードは高速で Pythonic な方法ですか?

idx_max = max(enumerate(x), key=lambda x:x[1])[0]
于 2011-12-07T14:46:46.547 に答える
8

この方法で argmax を考えるのが簡単であることがわかりました。たとえば、 からのアイテムがargmax(f(y))どこにあるかを計算したいとします。したがって、それぞれについて計算して maximumを取得します。yYyf(y)yf(y)

この argmax の定義は一般的なものであり、「反復可能な値が最大値のインデックスを返す」とは異なります (また、非常に自然な IMHO です)。

そして..ドラムロール.. Python では、組み込みの を使用して正確にこれを行うことができますmax:

best_y = max(Y, key=f)

したがってargmax_f、(受け入れられた回答から)不必要に複雑で非効率的なIMHOです-これは組み込みの複雑なバージョンですmax。他のすべての argmax のようなタスクは、この時点で明らかになるはずです: 適切な関数を定義するだけfです。

于 2013-03-14T20:54:07.010 に答える
7
def argmax(lst):
     return lst.index(max(lst))

または同様に:

argmax = lambda lst: lst.index(max(lst)
于 2012-07-20T21:00:13.650 に答える
6

Neil の回答に基づいていますが、複数の引数を取る関数に特化しています。

argmax = lambda keys, func: max(imap(lambda key: (func(*key), key), keys))[1]

例えば:

argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)
于 2011-02-24T00:11:18.390 に答える