在Python中实现argmax

时间:2011-02-23 23:22:45

标签: python itertools

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

可以实施三种方式:

  • 给定可迭代的对返回对应于最大值的键
  • 给定一个可迭代的值返回最大值的索引
  • 给定一个可重复的键和一个函数f,返回最大f(key)的键

5 个答案:

答案 0 :(得分:28)

我修改了我发现的最佳解决方案:

# 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)

答案 1 :(得分:20)

以下代码是快速和pythonic方式吗?

idx_max = max(enumerate(x), key=lambda x:x[1])[0]

答案 2 :(得分: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)

答案 3 :(得分:6)

我发现这种方式更容易考虑argmax:我们想要计算argmax(f(y))其中y是来自Y的项目。因此,对于每个y,我们要计算f(y)并获取最大y的{​​{1}}。

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

和..drumroll .. Python允许使用内置的f(y)完成此操作:

max

所以best_y = max(Y, key=f) (来自接受的答案)是不必要的复杂和低效的恕我直言 - 它是内置argmax_f的复杂版本。此时所有其他类似argmax的任务应该变得清晰:只需定义一个正确的函数max

答案 4 :(得分:5)

def argmax(lst):
     return lst.index(max(lst))

或类似地:

argmax = lambda lst: lst.index(max(lst)