web-dev-qa-db-ja.com

NaNまたは無限大に数値を設定することは可能ですか?

Pythonで配列の要素をNaNに設定することは可能ですか?

さらに、変数を+/-無限大に設定することは可能ですか?もしそうなら、数が無限大であるかどうかをチェックするための機能はありますか?

171
Bob

float()を使って文字列からキャストする:

>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False
222
marcog

はい、あなたは 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
70
Olivier Verdier

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定数は、単純なPythonのfloatオブジェクトを返します。
  • numpy.NINFは実際には-を必要としないことを私が知っている唯一の定数です。
  • complexおよびcmathを使用して複雑なNaNおよびInfinityを作成することができます。

    ╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
    │   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           │
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
    

    ¹の付いたオプションは、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またはInfinityのどちらであるかをチェックします。
  • numpy関数は、numpy配列、および1つに変換できるものすべて(リスト、Tupleなど)でも機能します。
  • NumPyで正と負の無限大を明示的にチェックする関数もあります:numpy.isposinfnumpy.isneginf
  • Pandasには、NaNをチェックするための2つの追加機能があります。 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.arraynumpy.array)に入れたいのであれば、配列の型mustfloatまたは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
24
MSeifert

Python 2.4を使っているときは、試してみてください。

inf = float("9e999")
nan = inf - inf

私は、Python 2.4を実行している組み込みデバイスにsimplejsonを移植していたときに問題に直面しています。float("9e999")はそれを修正しました。 inf = 9e999を使用しないでください、あなたはそれを文字列から変換する必要があります。 -inf-Infinityを与えます。

2
user6458202