NumPy Not-a-Number 値をブール値としてキャストすると、たとえば次のように True になります。
>>> import numpy as np
>>> bool(np.nan)
True
これは、私が直感的に期待するものとは正反対です。この行動の根底にある健全な原則はありますか?
(Octave でも同様の動作が発生しているように見えるので、あるのではないかと思います。)
これは NumPy 固有のものではありませんが、Python が NaN を処理する方法と一致しています。
In [1]: bool(float('nan'))
Out[1]: True
ルールはドキュメントに記載されています。
NaN の真偽値は False であるべきだと合理的に主張できると思います。しかし、これは言語が現在どのように機能するかではありません。
Pythonの真理値テストでは、次の値が考慮されると述べられていますFalse
。
- 0、0L、0.0、0j など、任意の数値型のゼロ。
Numpy はおそらく、この動作に固執し、NaN がFalse
ブール値のコンテキストで評価されないようにすることを選択しました。ただしnumpy.isnan
、 NaN のテストに使用できることに注意してください。
0.0
は、言語設計者が最も有用であると判断したため、唯一の偽の float 値です。Numpy は単に従います。bool(np.nan)
(がFalse
であるとは奇妙bool(float('nan'))
ですTrue
)。
おそらく、それが整数の扱い方だからだと思います。確かに、整数には NaN 型や inf 型の値はありませんが、特殊なケースはルールを破るほど特殊ではないと思います。
Numpy は、ここで真偽をテストするための Python 標準に従います。任意の数値型はFalse
、その数値がゼロである場合にのみ評価されます。
値を使用した真偽のテストはNaN
、他の方法でも直観的ではないことに注意してください (たとえば、 にnan == nan
評価されFalse
ます)。