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?
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.
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
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
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:
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:
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):returnnot(isnan(value)or isinf(value))
Untuk merangkum hasil yang diharapkan untuk fungsi-fungsi ini (dengan asumsi input adalah float):
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!
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.
isinf
danisnan
sebagaimana disediakan olehnumpy
. Lihat jawaban saya di bawah ini.Jawaban:
Keluarkan dari string menggunakan
float()
:sumber
Ya, Anda bisa menggunakannya
numpy
untuk itu.sumber
math.isnan()
danmath.isinf()
numpy
adalah impor yang cukup berat jika yang Anda inginkan adalahNaN
atauinf
NaN
atauInf
, orang bisafrom numpy import nan, inf
yang sudah ada sejak pertanyaan ini diajukan.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
:Pasangan berkomentar di atas meja:
float
konstruktor sebenarnya case-sensitive, sehingga Anda juga dapat menggunakanfloat("NaN")
ataufloat("InFiNiTy")
.cmath
dannumpy
konstanta kembali Python polosfloat
benda.numpy.NINF
adalah satu-satunya konstanta yang saya tahu yang tidak memerlukan-
.Dimungkinkan untuk membuat NaN dan Infinity yang kompleks dengan
complex
dancmath
:Opsi dengan ¹ mengembalikan dataran
float
, bukan acomplex
.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
:Sekali lagi beberapa komentar:
cmath
dannumpy
juga berfungsi untuk objek yang kompleks, mereka akan memeriksa apakah bagian nyata atau imajiner adalah NaN atau Infinity.numpy
Fungsi - fungsi ini juga berfungsi untuknumpy
array dan semua yang dapat dikonversi menjadi satu (seperti daftar, tuple, dll.)numpy.isposinf
dannumpy.isneginf
.NaN
:pandas.isna
danpandas.isnull
(tetapi tidak hanya NaN, itu juga cocok denganNone
danNaT
)Meskipun tidak ada fungsi bawaan, akan mudah untuk membuatnya sendiri (saya mengabaikan pemeriksaan tipe dan dokumentasi di sini):
Untuk merangkum hasil yang diharapkan untuk fungsi-fungsi ini (dengan asumsi input adalah float):
Dalam daftar itu tidak masalah, Anda selalu dapat menyertakan NaN (atau Infinity) di sana:
Namun jika Anda ingin memasukkannya dalam
array
(misalnyaarray.array
ataunumpy.array
) maka jenis array harus menjadifloat
ataucomplex
karena kalau tidak akan mencoba untuk tertunduk ke jenis array!sumber
math.isnan
tidak bekerja dengan bilangan kompleks. Gunakanmath.isnan(x.real) or math.isnan(x.imag)
sebagai gantinya.Saat menggunakan Python 2.4, coba
Saya menghadapi masalah ketika saya port javascript sederhana ke perangkat tertanam yang menjalankan Python 2.4,
float("9e999")
memperbaikinya. Jangan gunakaninf = 9e999
, Anda perlu mengubahnya dari string.-inf
memberikan-Infinity
.sumber