25

argmax 应该如何在 Python 中实现?它应该尽可能高效,因此它应该与可迭代对象一起使用。

可以通过三种方式实现:

  • 给定一个可迭代的对返回对应于最大值的键
  • 给定一个可迭代的值返回最大值的索引
  • 给定一个可迭代的键和一个函数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))哪里。所以对于每个我们想要计算并得到最大值的。yYyf(y)yf(y)

argmax 的这个定义是通用的,不像“给定一个可迭代的值返回最大值的索引”(恕我直言,这也是很自然的)。

并且 ..drumroll.. Python 允许使用内置的来做到这一点max

best_y = max(Y, key=f)

所以argmax_f(从公认的答案)是不必要的复杂和低效恕我直言 - 它是 built-in 的复杂版本max。在这一点上,所有其他类似 argmax 的任务都应该变得清晰:只需定义一个适当的 function 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

基于尼尔的回答,但专门用于接受多个参数的函数。

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 回答