libreria example espaƱol python itertools

example - product() python



implementando argmax en Python (5)

¿Cómo se debe implementar argmax en Python? Debe ser lo más eficiente posible, por lo que debe funcionar con iterables.

Tres formas en que se podría implementar:

  • dado un iterable de pares devuelve la clave correspondiente al mayor valor
  • dado un iterable de valores devuelve el índice del mayor valor
  • dado un iterable de teclas y una función f , devuelve la tecla con la mayor f(key)

¿Es el siguiente código una forma rápida y pitónica?

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


Basado en la respuesta de Neil, pero especializado para funciones que toman múltiples argumentos.

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

Por ejemplo:

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


Me pareció más fácil pensar en argmax: digamos que queremos calcular argmax(f(y)) donde y es un elemento de Y Entonces para cada y queremos calcular f(y) y obtener y con el máximo de f(y) .

Esta definición de argmax es general, a diferencia de "dado que una iterable de valores devuelve el índice del mayor valor" (y también es muy natural en mi humilde opinión).

Y ..drumroll ... Python permite hacer exactamente esto usando un max incorporado:

best_y = max(Y, key=f)

Así que argmax_f (de la respuesta aceptada) es innecesariamente complicado e ineficiente IMHO - es una versión complicada de max incorporado Todas las demás tareas similares a argmax deberían quedar claras en este punto: simplemente defina una función adecuada f .


Modifiqué la mejor solución que encontré:

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


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

o de manera análoga:

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