Внедрение argmax в Python
Как должен реализовываться argmax в Python? Он должен быть максимально эффективным, поэтому он должен работать с итерами.
Три способа его реализации:
- учитывая, что итерабельность пар возвращает ключ, соответствующий наибольшему значению
- с учетом итерабельности значений возвращает индекс наибольшего значения
- с учетом итерации ключей и функции
f
, верните ключ с наибольшим f(key)
Ответы
Ответ 1
Я изменил наилучшее найденное решение:
# 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)
Ответ 2
Является ли следующий код быстрым и путинским?
idx_max = max(enumerate(x), key=lambda x:x[1])[0]
Ответ 3
На основе ответа Нила, но специализируется на функции, которые принимают несколько аргументов.
argmax = lambda keys, func: max(imap(lambda key: (func(*key), key), keys))[1]
Например:
argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)
Ответ 4
def argmax(lst):
return lst.index(max(lst))
или аналогично:
argmax = lambda lst: lst.index(max(lst)
Ответ 5
Мне так легче было подумать об argmax: скажем, мы хотим вычислить argmax(f(y))
, где y
- это элемент из y
. Поэтому для каждого y
мы хотим рассчитать f(y)
и получить y
с максимальным значением f(y)
.
Это определение argmax является общим, в отличие от "учитывая, что итерабельность значений возвращает индекс наибольшего значения" (и это также вполне естественно ИМХО).
И..drumroll.. Python позволяет делать именно это, используя встроенный max
:
best_y = max(Y, key=f)
So argmax_f
(из принятого ответа) является ненужным сложным и неэффективным IMHO - это сложная версия встроенного max
. Все остальные задачи, подобные argmax, должны стать ясными: просто определите правильную функцию f
.