84
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【python】0,None,numpy.nanの比較

Last updated at Posted at 2019-01-14

はじめに

地味に気をつけていないと判定で思わぬミスがあるので、pythonでの0,None,numpy.nanの扱いについてまとめました。

比較まとめ

0 None numpy.nan
type() class <'int'> class <'NoneType'> class <'float'>
bool() False False True
他の数値との演算 0で割るとZeroDivisionError TypeError numpy.nan
is None False True False
numpy.isnan() False False True
自分との比較 True True False

それぞれの判定方法

None

is Noneを使う。

test.py
# NoneだったらFalse, それ以外ならTrueを返す
f = lambda x: True if x is not None else False

f(0)
# -> True
f(numpy.nan)
# -> True
f(None)
# -> False

numpy.nan

math.isnan(), numpy.isnan()を使う、または自分自身と比較する。

test.py
numpy.isnan(0)
# -> False
numpy.isnan(None)
# -> TypeError(Noneが数値でないため)
numpy.isnan(numpy.nan)
# -> True

# 自分自身との比較
0 == 0
# -> True
None == None
# -> True
numpy.nan == numpy.nan
# -> False

0,None,np.nanを判定する

test.py
def judge(data):
    if data is None:
        print('None')
    elif isinstance(data, int):
        print('0 or other number')
    else:
        # 非数
        print('Not A Number')

そもそもNone, numpy.nanって何?

None

型 NoneType の唯一の値です。None は、関数にデフォルト引数が渡されなかったときなどに、値の非存在を表すのに頻繁に用いられます。
python公式Doc

存在しないことを示すための定数。
存在しないからNoneに対する演算はError。

numpy.nan

IEEE 754 floating point representation of Not a Number (NaN).
scipy公式ドキュメント

数ではない浮動小数点を表す数(非数)。
自分自身との比較でFalseを返すのは非数としての特性。

まとめ

地味に判定で引っかかることがあるので、まとめました。
もっとスマートに判定する方法がありそうな気がします。
何かありましたらコメントをお願いします。

84
49
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
84
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?