2010-11-21 18 views
45

max(float('nan'), 1)がNaNと評価されたパラメータの順序に依存パイソン:最大/最小の組み込み関数は

max(1, float('nan'))は1

に評価され、それを意図行動ですか?


回答ありがとうございます。

maxは、イテラブルが空の場合に例外を発生させます。 nanが存在すると、Pythonのmaxが例外を発生させないのはなぜですか?または、少なくともnanのような有用なものを実行するか、nanを無視してください。現在の行動は非常に危険で、完全に不合理なようです。

私はこの動作のさらに驚くべき結果を発見したので、related questionを投稿しました。

+0

に機能min_maxを見上げる本当に...「ナン」でブレークしていないようです、Pythonのコードでこれを確認することができ、0.5(最大 'ので、 float( 'nan')、1) 'は1を返します。 – khachik

+2

@khachik:パラメータの順序に依存する「最大」結果は、私には予期せぬものです。しかし、実際にあなたの例でも動作します: 'max(float( 'nan')、1、0.5)'はnanを返します。 – max

+1

バグは最大ではありません。このバグは、浮動小数点を使用していて、意味のある数学的な動作をしていると仮定しているという事実です。 – Antimony

答えて

39
In [19]: 1>float('nan') 
Out[19]: False 

In [20]: float('nan')>1 
Out[20]: False 

フロートnanは整数1よりいずれも大きいも小さいです。 maxは、最初の要素を選択することから始まり、厳密に大きい要素が見つかると置換します。

In [31]: max(1,float('nan')) 
Out[31]: 1 

nanは1より大きくないので、1が返されます。 1以来

In [32]: max(float('nan'),1) 
Out[32]: nan 

は、nanが返されnanより大きくありません。


PS。なお、異なっnp.max扱いfloat('nan')

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 

しかし、あなたはnp.nan Sを無視したい場合は、あなたが使用することができnp.nanmax:最初の項目が設定されている

In [93]: np.nanmax([1,float('nan')]) 
Out[93]: 1.0 

In [94]: np.nanmax([float('nan'),1]) 
Out[94]: 1.0 
+6

ありがとうございました。しかし、ひどい行動、IMO。 – max

7

私は以前これを見ていませんでしたが、意味があります。 nanは非常に奇妙なオブジェクトであることに注意してください:

>>> x = float('nan') 
>>> x == x 
False 
>>> x > 1 
False 
>>> x < 1 
False 

私はmaxの行動が、この場合、未定義であることを言うだろう - あなたはどのような答えを期待しますか?賢明な唯一の振舞いは、操作が逆称であると仮定することです。あなたが壊れたクラスを作ることによってこの現象を再現することができます


お知らせ:

>>> 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 
+0

NaN比較の場合は、math.isnan関数を使用してください。 – Andrew

1

マックスは、次のように動作します次の値がこの値と比較されます。comparationは常にFalseを返します:

>>> float('nan') < 1 
False 
>>> float('nan') > 1 
False 

をだから、最初の値がNaNである場合、(comparationがfalseを返すので)それは次のステップ時に置き換えられません。

OTOH 1が最初の場合は同じことが起こりますが、この場合は1が設定されているため最大値になります。

あなたは、単にPythonの/ bltinmodule.c

関連する問題