Apakah mungkin untuk menetapkan angka ke NaN atau infinity?


203

Apakah mungkin untuk mengatur elemen array ke NaNdalam Python?

Selain itu, apakah mungkin untuk menetapkan variabel ke +/- tanpa batas? Jika demikian, apakah ada fungsi untuk memeriksa apakah suatu angka tidak terbatas atau tidak?


3
stackoverflow.com/questions/944700 memberi tahu Anda cara memeriksa NaN. Untuk Inf dan -Inf Anda dapat menguji dengan == tetapi itu tidak berfungsi untuk NaN karena aturan IEEE754 untuk NaN.
— David Heffernan

Saya pikir cara yang paling dapat diandalkan adalah dengan menggunakan fungsi yang tepat seperti isinfdan isnansebagaimana disediakan oleh numpy. Lihat jawaban saya di bawah ini.
— Olivier Verdier

Jawaban:


272

Keluarkan dari string menggunakan float():

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

1
Itu akan mengajari saya untuk tidak melompat dengan sindiran sebelum membaca pertanyaan untuk yang kedua kalinya !! Maaf! Yang mengatakan, tidak ada salahnya untuk mengatakan hal yang sama karena itu adalah jebakan yang mudah untuk jatuh, NaN! = NaN
— David Heffernan

2
perhatikan juga: >>> float ('Inf') - float ('Inf') ===> nan
— ntg

76

Ya, Anda bisa menggunakannya numpyuntuk itu.

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

21
Pada python> = 2.6, Anda bisa menggunakan math.isnan()danmath.isinf()
— Agos

8
numpyadalah impor yang cukup berat jika yang Anda inginkan adalah NaNatauinf
— cz

1
Jika semua yang Anda butuhkan adalah NaNatau Inf, orang bisa from numpy import nan, infyang sudah ada sejak pertanyaan ini diajukan.
— andrewgu

37

Apakah mungkin untuk menetapkan angka ke NaN atau infinity?

Ya, sebenarnya ada beberapa cara. Beberapa pekerjaan tanpa impor, sementara yang lain memerlukan import, namun untuk jawaban ini saya akan membatasi perpustakaan dalam ikhtisar untuk perpustakaan standar dan NumPy (yang bukan perpustakaan standar tetapi perpustakaan pihak ketiga yang sangat umum).

Tabel berikut merangkum cara-cara bagaimana seseorang dapat membuat angka tidak terbatas atau positif atau negatif 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    │
╘══════════╧══════════════╧════════════════════╧════════════════════╛

Pasangan berkomentar di atas meja:

  • The floatkonstruktor sebenarnya case-sensitive, sehingga Anda juga dapat menggunakan float("NaN")atau float("InFiNiTy").
  • The cmathdan numpykonstanta kembali Python polos floatbenda.
  • Ini numpy.NINFadalah satu-satunya konstanta yang saya tahu yang tidak memerlukan -.
  • Dimungkinkan untuk membuat NaN dan Infinity yang kompleks dengan complexdan 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           │
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛

    Opsi dengan ¹ mengembalikan dataran float, bukan a complex.

apakah ada fungsi untuk memeriksa apakah suatu angka tidak terbatas atau tidak?

Ya ada - sebenarnya ada beberapa fungsi untuk NaN, Infinity, dan Nan maupun Inf. Namun fungsi-fungsi yang telah ditentukan ini tidak built-in, mereka selalu memerlukan 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     │
╘══════════╧═════════════╧════════════════╧════════════════════╛

Sekali lagi beberapa komentar:

  • Fungsi cmathdan numpyjuga berfungsi untuk objek yang kompleks, mereka akan memeriksa apakah bagian nyata atau imajiner adalah NaN atau Infinity.
  • numpyFungsi - fungsi ini juga berfungsi untuk numpyarray dan semua yang dapat dikonversi menjadi satu (seperti daftar, tuple, dll.)
  • Ada juga fungsi yang secara eksplisit memeriksa infinity positif dan negatif di NumPy: numpy.isposinfdan numpy.isneginf.
  • Pandas menawarkan dua fungsi tambahan untuk memeriksa NaN: pandas.isnadan pandas.isnull(tetapi tidak hanya NaN, itu juga cocok dengan Nonedan NaT)
  • Meskipun tidak ada fungsi bawaan, akan mudah untuk membuatnya sendiri (saya mengabaikan pemeriksaan tipe dan dokumentasi di sini):

    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))

Untuk merangkum hasil yang diharapkan untuk fungsi-fungsi ini (dengan asumsi input adalah float):

╒════════════════╤═══════╤════════════╤═════════════╤══════════════════╕
│          input │ NaN   │ Infinity   │ -Infinity   │ something else   │
│ function       │       │            │             │                  │
╞════════════════╪═══════╪════════════╪═════════════╪══════════════════╡
│ isnan          │ True  │ False      │ False       │ False            │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isinf          │ False │ True       │ True        │ False            │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isfinite       │ False │ False      │ False       │ True             │
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛

Apakah mungkin untuk mengatur elemen array ke NaN dengan Python?

Dalam daftar itu tidak masalah, Anda selalu dapat menyertakan NaN (atau Infinity) di sana:

>>> [math.nan, math.inf, -math.inf, 1]  # python list
[nan, inf, -inf, 1]

Namun jika Anda ingin memasukkannya dalam array(misalnya array.arrayatau numpy.array) maka jenis array harus menjadi floatatau complexkarena kalau tidak akan mencoba untuk tertunduk ke jenis array!

>>> 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

1
Catatan: math.isnantidak bekerja dengan bilangan kompleks. Gunakan math.isnan(x.real) or math.isnan(x.imag)sebagai gantinya.
— Jonathan H

2

Saat menggunakan Python 2.4, coba

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

Saya menghadapi masalah ketika saya port javascript sederhana ke perangkat tertanam yang menjalankan Python 2.4, float("9e999")memperbaikinya. Jangan gunakan inf = 9e999, Anda perlu mengubahnya dari string. -infmemberikan -Infinity.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.