parametro - mclibre funciones python
Python: las funciones integradas max/min dependen del orden de los parĂ¡metros (3)
Max funciona de la siguiente manera:
El primer elemento se establece como maxval y luego el siguiente se compara con este valor. La comparación siempre devolverá False:
>>> float(''nan'') < 1
False
>>> float(''nan'') > 1
False
Entonces, si el primer valor es nan, entonces (dado que la comparación arroja un resultado falso) no será reemplazado en el próximo paso.
OTOH si 1 es el primero, pasa lo mismo: pero en este caso, como 1 fue establecido, será el máximo.
Puedes verificar esto en el código python, solo busca la función min_max en Python / bltinmodule.c
max(float(''nan''), 1)
evalúa a nan
max(1, float(''nan''))
evalúa a 1
¿Es el comportamiento previsto?
Gracias por las respuestas.
max
genera una excepción cuando el iterable está vacío. ¿Por qué el max
de Python no generaría una excepción cuando nan
está presente? O al menos hacer algo útil, como return nan
o ignore nan
. El comportamiento actual es muy inseguro y parece completamente irracional.
Encontré una consecuencia aún más sorprendente de este comportamiento, así que acabo de publicar una pregunta relacionada .
No he visto esto antes, pero tiene sentido. Tenga en cuenta que nan
es un objeto muy extraño:
>>> x = float(''nan'')
>>> x == x
False
>>> x > 1
False
>>> x < 1
False
Diría que el comportamiento de max
no está definido en este caso, ¿qué respuesta esperarías? El único comportamiento sensato es suponer que las operaciones son antisimétricas.
Observe que puede reproducir este comportamiento haciendo una clase rota:
>>> class Broken(object):
... __le__ = __ge__ = __eq__ = __lt__ = __gt__ = __ne__ =
... lambda self, other: False
...
>>> x = Broken()
>>> x == x
False
>>> x < 1
False
>>> x > 1
False
>>> max(x, 1)
<__main__.Broken object at 0x024B5B50>
>>> max(1, x)
1
In [19]: 1>float(''nan'')
Out[19]: False
In [20]: float(''nan'')>1
Out[20]: False
El flotante nan
no es ni más grande ni más pequeño que el número entero 1
. max
comienza eligiendo el primer elemento, y solo lo reemplaza cuando encuentra un elemento que es estrictamente más grande.
In [31]: max(1,float(''nan''))
Out[31]: 1
Como nan
no es mayor que 1, se devuelve 1.
In [32]: max(float(''nan''),1)
Out[32]: nan
Como 1 no es más grande que nan
, se devuelve nan
.
PD. Tenga en cuenta que np.max
trata float(''nan'')
diferente:
In [36]: import numpy as np
In [91]: np.max([1,float(''nan'')])
Out[91]: nan
In [92]: np.max([float(''nan''),1])
Out[92]: nan
pero si desea ignorar np.nan
s, puede usar np.nanmax
:
In [93]: np.nanmax([1,float(''nan'')])
Out[93]: 1.0
In [94]: np.nanmax([float(''nan''),1])
Out[94]: 1.0