静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


【python】numpyが入ってない標準Pythonでnanをゲットする方法

はじめに

 nanの値を取得したいときは、普通はnumpyを使うと思います。

>>> import numpy as np
>>> np.nan
nan

 まあ、そんなシチュエーションそもそもあまりないという話ですが。じゃあ、numpyがないときは?

 即答できる人はあまりいないと思います。

リテラルでnanと書いても受け付けられない

 できそうですが、できません。

>>> nan
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'nan' is not defined

 変数名とみなされます。しょうがないですね。

nanはfloatである

 nanは浮動小数点数の規格(IEEE 754 - Wikipedia)で定義されています。つまりPythonにおいてはfloatです。

>>> type(np.nan)
<class 'float'>

 標準の型で表現できる訳で、あとはどうやって連れてくるかですね。

mathから呼ぶ

 標準のmathモジュールはありがたいことに、nanを属性として持っています。numpyと同じです。

>>> import math
>>> math.nan
nan

 この方法がスマートでしょうか。でも、そのためだけにimportするのがだるいときもありますよね。

文字列→floatの変換で作る

 たとえば、

>>> int("3")
3

 のように文字列型→整数型の変換ができることは皆さんご存知だと思います。floatでも同じことができて、

>>> float("3.14")
3.14

 という操作が可能です。

 ここで理解した人もいると思いますが、以下のようにするとnanをゲットできます。

>>> float("nan")
nan

 タイプ数が若干多いですが、import不要です。でも、ちょっとトリッキーかも。あと、パフォーマンス上は当然不利なはずです。

便利に使う

 ゲットしたnanを変数に入れておくと、リテラルっぽく使えます。同名変数を定義しないのは当然ですが。

>>> nan = float("nan")
>>> [1.0, nan, 3.0]
[1.0, nan, 3.0]

 でもかえって可読性を落とす(nanの宣言から離れていると一見動かなさそうに見える。あるいは、nanのリテラルがあるという勘違いを生む)気もするので、使わない方が良いかも。

まとめ

 というようにゲットできますので、numpyないんだけどnanを扱わないといけないという悪夢のような目に遭っている人は試してみてください。それか、おとなしくnumpyをインストールしてください。