float('nan')
ผลลัพธ์ในน่าน (ไม่ใช่ตัวเลข) แต่ฉันจะตรวจสอบได้อย่างไร น่าจะง่ายมาก แต่ฉันหามันไม่เจอ
float('nan')
ผลลัพธ์ในน่าน (ไม่ใช่ตัวเลข) แต่ฉันจะตรวจสอบได้อย่างไร น่าจะง่ายมาก แต่ฉันหามันไม่เจอ
คำตอบ:
ส่งคืน
True
ถ้า x เป็น NaN (ไม่ใช่ตัวเลข) และเป็นFalse
อย่างอื่น
>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True
math.isnan
ที่ต้องการnp.isnan()
หรือไม่
import numpy
ใช้เวลาประมาณ RAM 15 MB ในขณะที่import math
ใช้เวลา 0,2 MB บางส่วน
numpy.isnan
เป็นตัวเลือกที่ดีกว่าเพราะจัดการกับ NumPy arrays หากคุณไม่ได้ใช้ NumPy ไม่มีประโยชน์ที่จะได้รับการพึ่งพา NumPy และใช้เวลาในการโหลด NumPy เพียงเพื่อตรวจสอบ NaN (แต่ถ้าคุณกำลังเขียนโค้ดประเภทที่ทำหน้าที่ตรวจสอบ NaN เป็นไปได้ว่าคุณควรจะใช้ NumPy)
วิธีปกติในการทดสอบ NaN คือดูว่ามีค่าเท่ากันหรือไม่:
def isNaN(num):
return num != num
numpy.isnan(number)
บอกคุณว่ามันเป็นNaN
หรือไม่
numpy.all(numpy.isnan(data_list))
นอกจากนี้ยังมีประโยชน์หากคุณต้องการตรวจสอบว่าองค์ประกอบทั้งหมดในรายการเป็นน่าน
all(map(math.isnan, [float("nan")]*5))
import pandas as pd
import numpy as np
import math
#For single variable all three libraries return single boolean
x1 = float("nan")
print(f"It's pd.isna : {pd.isna(x1)}")
print(f"It's np.isnan : {np.isnan(x1)}")
print(f"It's math.isnan : {math.isnan(x1)}")
เอาท์พุต
It's pd.isna : True
It's np.isnan : True
It's math.isnan : True
ps.isna()
แก้ปัญหาของฉัน ขอบคุณ!
นี่คือคำตอบที่ทำงานกับ:
float('nan')
, numpy.nan
...NaN ดำเนินการตามมาตรฐานเป็นเพียงค่าเดียวที่การเปรียบเทียบความไม่เท่าเทียมกับตัวมันเองควรคืนค่าเป็นจริง:
def is_nan(x):
return (x != x)
และตัวอย่างบางส่วน:
import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
print(f"{repr(value):<8} : {is_nan(value)}")
เอาท์พุท:
nan : True
nan : True
55 : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False
numpy.nan
เป็นงูหลามปกติวัตถุเช่นเดียวกับที่ส่งกลับชนิดโดยfloat
float('nan')
NaN ส่วนใหญ่ที่คุณพบใน NumPy จะไม่ใช่numpy.nan
วัตถุ
numpy.nan
กำหนดค่าน่านของมันในตัวเองในห้องสมุดต้นแบบใน C มันไม่ห่อ NaN ของงูใหญ่ แต่ตอนนี้พวกเขาทั้งสองปฏิบัติตามมาตรฐาน IEEE 754 เนื่องจากพวกเขาพึ่งพา C99 API
float('nan') is float('nan')
(ไม่ซ้ำกัน) และnp.nan is np.nan
(ไม่ซ้ำ)
np.nan
เป็นวัตถุเฉพาะในขณะที่การfloat('nan')
โทรแต่ละครั้งสร้างวัตถุใหม่ ถ้าคุณทำnan = float('nan')
เช่นนั้นคุณก็จะได้รับnan is nan
เช่นกัน ถ้าคุณสร้างจริง NumPy น่านกับสิ่งที่ต้องการnp.float64('nan')
แล้วคุณจะได้รับnp.float64('nan') is not np.float64('nan')
มากเกินไป
ที่จริงฉันเพิ่งพบเจอปัญหานี้ แต่สำหรับฉันมันคือการตรวจสอบว่าน่าน -inf หรือ inf ฉันเพิ่งใช้
if float('-inf') < float(num) < float('inf'):
นี่เป็นเรื่องจริงสำหรับตัวเลขเท็จสำหรับน่านและทั้ง inf และจะเพิ่มข้อยกเว้นสำหรับสิ่งต่าง ๆ เช่นสตริงหรือประเภทอื่น ๆ (ซึ่งอาจเป็นสิ่งที่ดี) นอกจากนี้สิ่งนี้ไม่จำเป็นต้องนำเข้าไลบรารีใด ๆ เช่น math หรือ numpy (numpy นั้นใหญ่มากจนขนาดของแอปพลิเคชั่นที่คอมไพล์แล้ว)
math.isfinite
ไม่ได้ถูกนำมาใช้จนกระทั่ง Python 3.2 ดังนั้นคำตอบจาก @DaveTheScientist จึงถูกโพสต์ในปี 2012 มันไม่ใช่ "reinvent [ing] the wheel" - โซลูชันยังคงใช้ได้สำหรับผู้ที่ทำงานกับ Python 2
หรือเปรียบเทียบตัวเลขกับตัวเอง NaN อยู่เสมอ! = NaN มิฉะนั้น (เช่นถ้าเป็นตัวเลข) การเปรียบเทียบควรสำเร็จ
อีกวิธีหนึ่งหากคุณติดค้างที่ <2.6 คุณไม่มีปัญหาและคุณไม่มีการรองรับ IEEE 754:
def isNaN(x):
return str(x) == str(1e400*0)
ฉันเข้าสู่โพสต์นี้เพราะฉันมีปัญหากับฟังก์ชั่น:
math.isnan()
มีปัญหาเมื่อคุณเรียกใช้รหัสนี้:
a = "hello"
math.isnan(a)
มันทำให้เกิดข้อยกเว้น ทางออกของฉันคือการตรวจสอบอีกครั้ง:
def is_nan(x):
return isinstance(x, float) and math.isnan(x)
def is_nan(x): try: return math.isnan(x) except: return False
ด้วย python <2.6 ฉันลงเอยด้วย
def isNaN(x):
return str(float(x)).lower() == 'nan'
สิ่งนี้ใช้ได้กับฉันด้วย python 2.5.1 บนกล่อง Solaris 5.9 และ python 2.6.5 บน Ubuntu 10
-1.#IND
ฉันได้รับข้อมูลจากบริการเว็บที่ส่งเป็นสตริงNaN
'Nan'
แต่อาจมีสตริงอื่น ๆ ในข้อมูลของฉันเช่นกันดังนั้นข้อผิดพลาดง่าย ๆfloat(value)
อาจทำให้เกิดข้อยกเว้น ฉันใช้ตัวแปรคำตอบที่ยอมรับต่อไปนี้:
def isnan(value):
try:
import math
return math.isnan(float(value))
except:
return False
ต้องการ:
isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True
try: int(value)
value
การเป็นNaN
หรือไม่?
NaN
(เช่นในงูหลามสิ่งที่คุณจะได้รับจากfloat('inf') * 0
) และดังนั้นแม้ว่าสตริง 'Hello' ไม่ได้เป็นจำนวน แต่มันก็ไม่ได้NaN
เพราะNaN
ยังคงเป็นค่าตัวเลข!
int(value)
ยกเว้นทั้งหมดFalse
จะถูกเขียน
วิธีการทั้งหมดที่จะบอกว่าตัวแปรคือ NaN หรือไม่มี:
ไม่มีประเภท
In [1]: from numpy import math
In [2]: a = None
In [3]: not a
Out[3]: True
In [4]: len(a or ()) == 0
Out[4]: True
In [5]: a == None
Out[5]: True
In [6]: a is None
Out[6]: True
In [7]: a != a
Out[7]: False
In [9]: math.isnan(a)
Traceback (most recent call last):
File "<ipython-input-9-6d4d8c26d370>", line 1, in <module>
math.isnan(a)
TypeError: a float is required
In [10]: len(a) == 0
Traceback (most recent call last):
File "<ipython-input-10-65b72372873e>", line 1, in <module>
len(a) == 0
TypeError: object of type 'NoneType' has no len()
ประเภท NaN
In [11]: b = float('nan')
In [12]: b
Out[12]: nan
In [13]: not b
Out[13]: False
In [14]: b != b
Out[14]: True
In [15]: math.isnan(b)
Out[15]: True
หากคุณมีประเภทผสมใน iterable นี่คือวิธีการแก้ปัญหาที่ไม่ได้ใช้ numpy:
from math import isnan
Z = ['a','b', float('NaN'), 'd', float('1.1024')]
[x for x in Z if not (
type(x) == float # let's drop all float values…
and isnan(x) # … but only if they are nan
)]
['a', 'b', 'd', 1.1024]
การประเมินการลัดวงจรหมายความว่าisnan
จะไม่ถูกเรียกใช้บนค่าที่ไม่ใช่ของประเภท 'ลอย' เมื่อFalse and (…)
ประเมินอย่างรวดเร็วFalse
โดยไม่ต้องประเมินทางด้านขวามือ
ใน Python 3.6 การตรวจสอบค่าสตริง x math.isnan (x) และ np.isnan (x) ทำให้เกิดข้อผิดพลาด ดังนั้นฉันไม่สามารถตรวจสอบว่าค่าที่กำหนดเป็น NaN หรือไม่ถ้าฉันไม่ทราบล่วงหน้าว่าเป็นตัวเลข ดูเหมือนว่าต่อไปนี้เพื่อแก้ไขปัญหานี้
if str(x)=='nan' and type(x)!='str':
print ('NaN')
else:
print ('non NaN')
ดูเหมือนว่าการตรวจสอบว่ามันเท่ากับตัวเอง
x!=x
เร็วที่สุด
import pandas as pd
import numpy as np
import math
x = float('nan')
%timeit x!=x
44.8 ns ± 0.152 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit math.isnan(x)
94.2 ns ± 0.955 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit pd.isna(x)
281 ns ± 5.48 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.isnan(x)
1.38 µs ± 15.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
สำหรับน่านชนิดลอย
>>> import pandas as pd
>>> value = float(nan)
>>> type(value)
>>> <class 'float'>
>>> pd.isnull(value)
True
>>>
>>> value = 'nan'
>>> type(value)
>>> <class 'str'>
>>> pd.isnull(value)
False
สำหรับสตริงใน panda take pd.isnull:
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
ฟังก์ชั่นเป็นคุณสมบัติการแยกสำหรับ NLTK
def act_features(atext):
features = {}
if not pd.isnull(atext):
for word in nltk.word_tokenize(atext):
if word not in default_stopwords:
features['cont({})'.format(word.lower())]=True
return features