在 Python 中实现 argmax

发布于 2024-10-18 20:16:41 字数 208 浏览 6 评论 0原文

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

可以通过三种方式实现:

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

How should argmax be implemented in Python? It should be as efficient as possible, so it should work with iterables.

Three ways it could be implemented:

  • given an iterable of pairs return the key corresponding to the greatest value
  • given an iterable of values return the index of the greatest value
  • given an iterable of keys and a function f, return the key with largest f(key)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

冷月断魂刀 2024-10-25 20:16:41

我修改了我找到的最佳解决方案:

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

I modified the best solution I found:

# 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)
陌生 2024-10-25 20:16:41

下面的代码是一种快速且Pythonic的方式吗?

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

Is the following code a fast and pythonic way?

idx_max = max(enumerate(x), key=lambda x:x[1])[0]
无法言说的痛 2024-10-25 20:16:41
def argmax(lst):
     return lst.index(max(lst))

或类似地:

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

or analogously:

argmax = lambda lst: lst.index(max(lst)
红ご颜醉 2024-10-25 20:16:41

我发现这种方式更容易考虑 argmax:假设我们要计算 argmax(f(y)),其中 y 是来自 Y 的项目。因此,对于每个 y,我们要计算 f(y) 并获得具有最大 f(y)y

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

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

best_y = max(Y, key=f)

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

I found this way easier to think about argmax: say we want to calculate argmax(f(y)) where y is an item from Y. So for each y we want to calculate f(y) and get y with maximum f(y).

This definition of argmax is general, unlike "given an iterable of values return the index of the greatest value" (and it is also quite natural IMHO).

And ..drumroll.. Python allows to do exactly this using a built-in max:

best_y = max(Y, key=f)

So argmax_f (from the accepted answer) is unnecesary complicated and inefficient IMHO - it is a complicated version of built-in max. All other argmax-like tasks should become clear at this point: just define a proper function f.

待天淡蓝洁白时 2024-10-25 20:16:41

基于尼尔的答案,但专门用于采用多个参数的函数。

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

例如:

argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)

Based on Neil's answer, but specialized for functions that take multiple arguments.

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

For example:

argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文