NaN
Pythonで配列の要素をに設定することは可能ですか?
さらに、変数を+/-無限大に設定することは可能ですか?もしそうなら、数が無限大かどうかをチェックする機能はありますか?
isinf
し、isnan
などにより提供されますnumpy
。以下の私の答えを参照してください。
NaN
Pythonで配列の要素をに設定することは可能ですか?
さらに、変数を+/-無限大に設定することは可能ですか?もしそうなら、数が無限大かどうかをチェックする機能はありますか?
isinf
し、isnan
などにより提供されますnumpy
。以下の私の答えを参照してください。
回答:
文字列からキャストfloat()
:
>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False
はい、numpy
そのために使用できます。
import numpy as np
a = arange(3,dtype=float)
a[0] = np.nan
a[1] = np.inf
a[2] = -np.inf
a # is now [nan,inf,-inf]
np.isnan(a[0]) # True
np.isinf(a[1]) # True
np.isinf(a[2]) # True
math.isnan()
andmath.isinf()
numpy
あなたが望むすべてがそうであるならば、それはかなり重いインポートですNaN
inf
NaN
またはの場合Inf
、from numpy import nan, inf
この質問が出されてから存在していた可能性があります。
数値をNaNまたは無限大に設定することは可能ですか?
はい、実際にはいくつかの方法があります。インポートなしで機能するものもあれば、必要なものもありますがimport
、この回答では、概要のライブラリを標準ライブラリとNumPy(標準ライブラリではなく、非常に一般的なサードパーティライブラリ)に制限します。
次の表は、非数、正または負の無限大を作成する方法をまとめたものですfloat
。
╒══════════╤══════════════╤════════════════════╤════════════════════╕
│ result │ NaN │ Infinity │ -Infinity │
│ module │ │ │ │
╞══════════╪══════════════╪════════════════════╪════════════════════╡
│ built-in │ float("nan") │ float("inf") │ -float("inf") │
│ │ │ float("infinity") │ -float("infinity") │
│ │ │ float("+inf") │ float("-inf") │
│ │ │ float("+infinity") │ float("-infinity") │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ math │ math.nan │ math.inf │ -math.inf │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ cmath │ cmath.nan │ cmath.inf │ -cmath.inf │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ numpy │ numpy.nan │ numpy.PINF │ numpy.NINF │
│ │ numpy.NaN │ numpy.inf │ -numpy.inf │
│ │ numpy.NAN │ numpy.infty │ -numpy.infty │
│ │ │ numpy.Inf │ -numpy.Inf │
│ │ │ numpy.Infinity │ -numpy.Infinity │
╘══════════╧══════════════╧════════════════════╧════════════════════╛
表へのカップルのコメント:
float
あなたも使用できるようにコンストラクタは、実際には大文字と小文字を区別しませんfloat("NaN")
かfloat("InFiNiTy")
。cmath
numpy
float
numpy.NINF
実際に必要としないことを私は知っている唯一の定数です-
。との複合はNaNと無限を作成することが可能であるcomplex
とcmath
:
╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
│ result │ NaN+0j │ 0+NaNj │ Inf+0j │ 0+Infj │
│ module │ │ │ │ │
╞══════════╪════════════════╪═════════════════╪═════════════════════╪══════════════════════╡
│ built-in │ complex("nan") │ complex("nanj") │ complex("inf") │ complex("infj") │
│ │ │ │ complex("infinity") │ complex("infinityj") │
├──────────┼────────────────┼─────────────────┼─────────────────────┼──────────────────────┤
│ cmath │ cmath.nan ¹ │ cmath.nanj │ cmath.inf ¹ │ cmath.infj │
╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
withのオプションはfloat
、ではなくプレーンを返しますcomplex
。
数が無限大かどうかをチェックする機能はありますか?
はい、あります。実際には、NaN、Infinity、およびNanもInfにもいくつかの関数があります。ただし、これらの事前定義された関数は組み込みではなく、常にimport
:
╒══════════╤═════════════╤════════════════╤════════════════════╕
│ for │ NaN │ Infinity or │ not NaN and │
│ │ │ -Infinity │ not Infinity and │
│ module │ │ │ not -Infinity │
╞══════════╪═════════════╪════════════════╪════════════════════╡
│ math │ math.isnan │ math.isinf │ math.isfinite │
├──────────┼─────────────┼────────────────┼────────────────────┤
│ cmath │ cmath.isnan │ cmath.isinf │ cmath.isfinite │
├──────────┼─────────────┼────────────────┼────────────────────┤
│ numpy │ numpy.isnan │ numpy.isinf │ numpy.isfinite │
╘══════════╧═════════════╧════════════════╧════════════════════╛
再びいくつかの発言:
cmath
およびnumpy
機能は、いずれかの実数または虚数部がNaNまたは無限大の場合、彼らはチェックしますが、複雑なオブジェクトのために働きます。numpy
関数は、numpy
配列や、1つに変換できるすべてのもの(リスト、タプルなど)でも機能します。numpy.isposinf
とに、正と負の無限大を明示的にチェックする関数もありnumpy.isneginf
ます。NaN
:pandas.isna
及びpandas.isnull
(だけでなく、NaNで、それはまた、一致してNone
とNaT
)組み込み関数はありませんが、自分で作成するのは簡単です(ここでは型チェックとドキュメントを無視しました)。
def isnan(value):
return value != value # NaN is not equal to anything, not even itself
infinity = float("infinity")
def isinf(value):
return abs(value) == infinity
def isfinite(value):
return not (isnan(value) or isinf(value))
これらの関数の予想される結果を要約するには(入力がfloatであると想定):
╒════════════════╤═══════╤════════════╤═════════════╤══════════════════╕
│ input │ NaN │ Infinity │ -Infinity │ something else │
│ function │ │ │ │ │
╞════════════════╪═══════╪════════════╪═════════════╪══════════════════╡
│ isnan │ True │ False │ False │ False │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isinf │ False │ True │ True │ False │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isfinite │ False │ False │ False │ True │
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛
Pythonで配列の要素をNaNに設定することは可能ですか?
リストには問題ありません。いつでもNaN(またはInfinity)を含めることができます。
>>> [math.nan, math.inf, -math.inf, 1] # python list
[nan, inf, -inf, 1]
ただし、それをarray
(たとえばarray.array
またはnumpy.array
)に含めたい場合は、配列のタイプをorにする必要があります。そうでない場合は、配列タイプにダウンキャストしようとします。float
complex
>>> import numpy as np
>>> float_numpy_array = np.array([0., 0., 0.], dtype=float)
>>> float_numpy_array[0] = float("nan")
>>> float_numpy_array
array([nan, 0., 0.])
>>> import array
>>> float_array = array.array('d', [0, 0, 0])
>>> float_array[0] = float("nan")
>>> float_array
array('d', [nan, 0.0, 0.0])
>>> integer_numpy_array = np.array([0, 0, 0], dtype=int)
>>> integer_numpy_array[0] = float("nan")
ValueError: cannot convert float NaN to integer
math.isnan
は複素数では機能しません。math.isnan(x.real) or math.isnan(x.imag)
代わりに使用してください。
Python 2.4を使用している場合は、
inf = float("9e999")
nan = inf - inf
simplejsonをPython 2.4を実行する組み込みデバイスに移植していたときに問題が発生しましたfloat("9e999")
。修正しました。は使用しないでくださいinf = 9e999
。文字列から変換する必要があります。
-inf
を与えます-Infinity
。