NaN අගයන් පරීක්ෂා කරන්නේ කෙසේද?


1042

float('nan')ප්‍රති results ල නාන් (අංකයක් නොවේ). නමුත් මම එය පරීක්ෂා කරන්නේ කෙසේද? ඉතා පහසු විය යුතුය, නමුත් මට එය සොයාගත නොහැක.


21
Python දී නන් සමහර ඉතිහාසය සඳහා, පී 754. බලන්න python.org/dev/peps/pep-0754
ක්රේග් McQueen

Answers:


1348

math.isnan (x)

TrueX යනු NaN (අංකයක් නොවේ) සහ Falseවෙනත් ආකාරයකින් ආපසු යන්න .

>>> import math
>>> x = float('nan')
>>> math.isnan(x)
True

5
@ චාලි-පාකර්: පයිතන් 3 හි, math.isnan තවමත් ගණිත මොඩියුලයේ කොටසකි. docs.python.org/3/library/math.html#math.isnan . ඔබට අවශ්‍ය නම් numpy.isnan භාවිතා කරන්න, මෙම පිළිතුර යෝජනාවක් පමණි.
gimel

2
Iting SittingBull බලන්න docs.python.org/3/library/functions.html#float "තර්කය නූලක් නම්, එය දශම සංඛ්‍යාවක් අඩංගු විය යුතුය", හෝ "අනන්තය" "inf" "nan"
gimel

40
ඇත math.isnanකැමැත්තක් np.isnan()?
ටී.එම්.ඩබ්ලිව්.පී

38
@TMWP සමහර විට ... import numpyRAM 15 MB පමණ import mathගත වන අතර 0,2 MB පමණ වේ
petrpulc

12
@TMWP: ඔබ NumPy භාවිතා කරන්නේ නම් numpy.isnan, එය NumPy අරා හසුරුවන බැවින් වඩා හොඳ තේරීමකි. ඔබ NumPy භාවිතා නොකරන්නේ නම්, NumPy යැපීමක් ලබා ගැනීම සහ NaNP චෙක්පතක් සඳහා NumPy පැටවීම සඳහා කාලය ගත කිරීමෙන් කිසිදු ප්‍රතිලාභයක් නොමැත (නමුත් ඔබ NaN චෙක්පත් කරන ආකාරයේ කේතයක් ලියන්නේ නම්, බොහෝ විට ඔබ භාවිතා කළ යුතුය NumPy).
user2357112 මොනිකා

378

NaN සඳහා පරීක්ෂා කිරීම සඳහා සුපුරුදු ක්‍රමය නම් එය තමාටම සමාන දැයි බැලීමයි:

def isNaN(num):
    return num != num

8
අනතුරු ඇඟවීමේ වචනය: බෙයාර්ගේ අදහස පහතින් උපුටා දක්වමින් "පයිතන් සමඟ සිරවී සිටින පුද්ගලයින් සඳහා <= 2.5. නන්! = නාන් විශ්වාසදායක ලෙස ක්‍රියා කළේ නැත. එසේ පැවසීමෙන් පසු, එය අසාර්ථක වන බව මා දැක නැත.
mavnn

24
මට විශ්වාසයි, ක්‍රියාකරු අධික ලෙස පැටවීම, මට මෙම ක්‍රියාව ව්‍යාකූල කළ හැකි ක්‍රම රාශියක් ඇති බව. math.isnan () සමඟ යන්න
djsadinoff

4
එය ඉහත සඳහන් කළ 754 පිරිවිතරයේ NaN == NaN සැමවිටම අසත්‍ය විය යුතු නමුත් එය සැමවිටම ක්‍රියාත්මක නොවේ. කෙසේ වෙතත් ගණිතය සහ / හෝ අංකනය මෙය කබාය යටතේ පරීක්ෂා කරන්නේ කෙසේ ද?
හරී ගනේෂන්

7
මෙය ක්‍රියාත්මක වුවද, යම් තාක් දුරට අර්ථවත් වුවද, මම ප්‍රතිපත්ති සහිත මිනිසෙකු වන අතර මම මෙය තහනම් මායා කර්මයක් ලෙස ප්‍රකාශ කරමි. කරුණාකර ඒ වෙනුවට math.isnan භාවිතා කරන්න.
ගොන්සාලෝ

3
jdjsadinoff ව්යාකූලත්වයට වෙනත් අඩුපාඩුවක් තිබේද? math.isnan () හට නූල් අගයන් පරීක්ෂා කළ නොහැක, එබැවින් මෙම විසඳුම වඩාත් ශක්තිමත් බව පෙනේ.
විලියම් ටෝර්කින්ටන්

167

numpy.isnan(number)එය තිබේද නැද්ද යන්න ඔබට කියයි NaN.


3
පයිතන් අනුවාදය 2.7 හි ද ක්‍රියා කරයි.
මයිකල් කෙයිජර්ස්

6
numpy.all(numpy.isnan(data_list))ලැයිස්තුවේ ඇති සියලුම අංග නන් දැයි තීරණය කිරීමට අවශ්‍ය නම් එය ද ප්‍රයෝජනවත් වේ
ජේ පී.

3
NumPy අවශ්‍ය නැත:all(map(math.isnan, [float("nan")]*5))
sleblanc

6
මීට වසර 6 කට පෙර මෙම පිළිතුර ලියන විට, පයිතන් 2.5 තවමත් පොදු භාවිතයේ පැවතුනි - සහ math.isnan සම්මත පුස්තකාලයේ කොටසක් නොවීය. දැන් මම ඇත්තටම බලාපොරොත්තු වෙනවා බොහෝ තැන්වල එය එසේ නොවන බව!
mavnn

4
np.isnan () දශම හසුරුවන්නේ නැති බව සලකන්න. ඩෙසිමල් වර්ගය (බොහෝ සංඛ්‍යා වල ක්‍රියාකාරිත්වය තරම්). math.isnan () හසුරුවයි.
comte

69

විචල්‍යයක් පරීක්ෂා කළ හැකි ක්‍රම තුනක් මෙන්න “NaN” හෝ නොවේ.

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

3
pd.isna (අගය) බොහෝ කරදර ඉතිරි කළේය! චාම් එකක් වගේ වැඩ කරනවා!
අභිෂේක්

34

මෙන්න වැඩ කරන පිළිතුරක්:

  • IEEE 754 ප්‍රමිතියට අදාළ NaN ක්‍රියාත්මක කිරීම්
    • එනම්: පිඹුරා ගේ නන්: 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

1
මා පරික්ෂා කරන ශ්‍රේණිය අස්ථානගත අගයන් සහිත නූල් 'නන්ස්' (???) බැවින් අනෙක් අය අසමත් වූ තැන මෙම විසඳුම ක්‍රියාත්මක වේ.
keithpjolley

numpy.nanනිත්‍ය පයිතන් floatවස්තුවකි float('nan'). NumPy හි ඔබට හමු වන බොහෝ NaNs numpy.nanවස්තුව නොවනු ඇත .
user2357112 මොනිකා සඳහා සහය දක්වයි

numpy.nanC හි යටින් පවතින පුස්තකාලයේ එහි NaN අගය තනිවම අර්ථ දක්වයි . එය පයිතන්ගේ NaN ඔතා නැත. නමුත් දැන්, ඔවුන් දෙදෙනාම C99 API මත විශ්වාසය තබන බැවින් IEEE 754 ප්‍රමිතියට අනුකූල වේ.
x0s

@ user2357112supportsMonica: පයිතන් සහ අංකිත NaN ඇත්ත වශයෙන්ම එකම ආකාරයකින් හැසිරෙන්නේ නැත: float('nan') is float('nan')(අද්විතීය නොවන) සහ np.nan is np.nan(අද්විතීය)
x0s

@ x0s: එයට NumPy සමඟ කිසිදු සම්බන්ධයක් නැත. np.nanනිශ්චිත වස්තුවක් වන අතර සෑම float('nan')ඇමතුමක්ම නව වස්තුවක් නිපදවයි. ඔබ එසේ කළා nan = float('nan')නම්, ඔබටත් ලැබෙනු nan is nanඇත. ඔබ වැනි දෙයක් සමඟ සත්‍ය NumPy NaN එකක් සෑදුවා np.float64('nan')නම්, ඔබටත් ලැබෙනු np.float64('nan') is not np.float64('nan')ඇත .
user2357112 මොනිකා සඳහා සහය දක්වයි

28

මම ඇත්තටම මේකට දිව්වා, නමුත් මට නම් එය නන්, -ඉන්ෆ් හෝ ඉන්ෆ්. මම දැන් පාවිච්චි කළා

if float('-inf') < float(num) < float('inf'):

මෙය සංඛ්‍යා සඳහා සත්‍ය වන අතර, නන් සහ ඉන්ෆ් යන දෙකටම අසත්‍ය වන අතර, නූල් හෝ වෙනත් වර්ග වැනි දේ සඳහා ව්‍යතිරේකයක් මතු කරනු ඇත (එය බොහෝ විට හොඳ දෙයක් විය හැකිය). ගණිත හෝ අංකී වැනි කිසිදු පුස්තකාලයක් ආනයනය කිරීම මෙයට අවශ්‍ය නොවේ (අංකී ඉතා විශාල බැවින් එය සම්පාදනය කරන ලද යෙදුමක ප්‍රමාණය මෙන් දෙගුණයක් වේ).


10
math.isfiniteපයිතන් 3.2 වන තෙක් හඳුන්වා දී නොතිබුණි, එබැවින් 2012 දී ave ඩේව් සයන්ටිස්ට්ගේ පිළිතුර ලබා දුන් විට එය හරියටම "රෝදය ප්‍රතිනිර්මාණය කිරීමක්" නොවීය - විසඳුම තවමත් පයිතන් 2 සමඟ වැඩ කරන අය සඳහා පවතී
sudo_coffee

23

math.isnan ()

හෝ අංකය තමාටම සංසන්දනය කරන්න. ! = නන්, වෙනත් ආකාරයකින් සෑම විටම නන් වේ (එය උදා නම් වේ ගණනාවක්) ඇති සැසැඳුම සාර්ථක යුතුය.


6
පයිතන් <= 2.5 සමඟ සිරවී සිටින පුද්ගලයින් සඳහා. නාන්! = නන් විශ්වසනීයව වැඩ කළේ නැත. ඒ වෙනුවට අංක භාවිතා කර ඇත.
වලස්

16

ඔබ <2.6 හි සිරවී සිටින්නේ නම් තවත් ක්‍රමයක් නම්, ඔබට අමිහිරි බවක් නොමැති අතර ඔබට IEEE 754 සහය නොමැත:

def isNaN(x):
    return str(x) == str(1e400*0)

13

හොඳයි, මම මෙම තනතුරට ඇතුළු වූයේ, මට ශ්‍රිතයේ යම් යම් ගැටලු ඇති බැවිනි:

math.isnan()

ඔබ මෙම කේතය ක්‍රියාත්මක කිරීමේදී ගැටළු තිබේ:

a = "hello"
math.isnan(a)

එය ව්යතිරේකය මතු කරයි. ඒ සඳහා මගේ විසඳුම වන්නේ තවත් පරීක්‍ෂණයක් කිරීමයි:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)

3
ඉස්නාන් () පාවීමක් මිස නූලක් නොගන්නා නිසා එය බොහෝ විට පහත් කොට සලකනු ලැබීය. ශ්‍රිතයේ කිසිදු වරදක් නොමැති අතර, ගැටලු ඇත්තේ ඔහු එය භාවිතා කිරීමට උත්සාහ කිරීම තුළ පමණි. (එම විශේෂිත භාවිත අවස්ථාව සඳහා ඔහුගේ විසඳුම වලංගු වේ, නමුත් එය මෙම ප්‍රශ්නයට පිළිතුරක් නොවේ.)
පීටර් හැන්සන්

6
මේ ආකාරයෙන් වර්ග පරීක්ෂා කිරීමේදී ප්‍රවේශම් වන්න. උදා: numpy.float32 NaN සඳහා මෙය ක්‍රියා නොකරනු ඇත. ඉදිකිරීම් හැර / උත්සාහයක් භාවිතා කිරීම වඩා හොඳය: def is_nan(x): try: return math.isnan(x) except: return False
රොබ්

3
නන් නැහැ නැහැ අදහස් අගය වලංගු අංකයක් නොවන බව. නිශ්චිත ප්‍රති result ලයක් නිර්වචනය කර නොමැති බව සඳහන් කිරීම IEEE පාවෙන ලක්ෂ්‍ය නිරූපණයෙහි කොටසකි. උදා: 0 / 0. එබැවින් "හෙලෝ" නන් දැයි විමසීම අර්ථ විරහිත ය.
බ්‍රයිස් එම්. ඩෙම්ප්සි

2
NaN හට ඕනෑම නූල්, තීන්ත හෝ පාවෙන ලැයිස්තුවකට ගොඩ
බැසීමට

පැන්ඩා වල තීරු තීරු හැසිරවීම සඳහා මට මෙය හරියටම ක්‍රියාත්මක කිරීමට සිදුවිය.
ක්‍රිස්ටියන් ගාර්ෂියා

7

පයිතන් <2.6 සමඟ මම අවසන් කළෙමි

def isNaN(x):
    return str(float(x)).lower() == 'nan'

මෙය මට සෝලාරිස් 5.9 පෙට්ටියක පයිතන් 2.5.1 සහ උබුන්ටු 10 හි පයිතන් 2.6.5 සමඟ වැඩ කරයි


6
වින්ඩෝස් සමහර විට මෙය හඳුන්වන පරිදි මෙය එතරම් අතේ ගෙන යා නොහැක-1.#IND
මයික් ටී

5

මම එවන වෙබ්-සේවයෙන් දත්ත ලබාගන්නා මා 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

1
හෝtry: int(value)
chwi

@chwi ඒ දේ ඔබේ යෝජනාව ගැන කියන්නේ මොනවාද valueවීම NaNහෝ නැහැ?
මහදි

හොඳයි, "අංකයක් නොවේ", මම අනුමාන කරන ලද int එකකට දැමිය නොහැකි කිසිවක් ඇත්ත වශයෙන්ම අංකයක් නොවන අතර උත්සාහ ප්‍රකාශය අසාර්ථක වේද? අසත්‍යය හැරෙන්නට උත්සාහ කරන්න, සත්‍යය වෙත ආපසු යන්න.
chwi

wchwi හොඳයි, "අංකයක් නොවේ" යන්න වචනානුසාරයෙන් ගත් කල, ඔබ හරි, නමුත් මෙහි කාරණය එය නොවේ. ඇත්ත වශයෙන්ම, මම හරියටම සොයන්නේ අර්ථ නිරූපණය NaNයනු කුමක්ද (පයිතන් මෙන් ඔබට ලබා ගත හැකි දේ float('inf') * 0), මේ අනුව 'හෙලෝ' නූල අංකයක් නොවුවද එය තවමත් සංඛ්‍යාත්මක අගයක් NaNනිසා නොවේ NaN!
මහදි

wchwi: ව්‍යතිරේකය හැසිරවීම නිශ්චිත ව්‍යතිරේකයක් සඳහා නම් ඔබ නිවැරදිය. නමුත් මෙම පිළිතුරේ දී, සාමාන්‍ය ව්‍යතිරේකය හසුරුවා ඇත. එබැවින් පරීක්ෂා කිරීම අවශ්‍ය නොවේ int(value)සියලු ව්‍යතිරේකයන් සඳහා, Falseලියනු ලැබේ.
හර්ෂ බියානි

4

එය තමාටම සමාන දැයි පරීක්ෂා කිරීම පෙනේ

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)

3

විචල්‍යය 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

2

මිශ්‍ර දත්ත වර්ග ලැයිස්තුවකින් NaN (පාවෙන) අයිතම (ය) ඉවත් කරන්නේ කෙසේද?

ඔබට නැවත සැකසිය හැකි මිශ්‍ර වර්ග තිබේ නම්, අංකයක් භාවිතා නොකරන විසඳුමක් මෙන්න:

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


2

පයිතන් 3.6 හි x math.isnan (x) සහ np.isnan (x) යන නූල් අගයක් පරීක්ෂා කිරීම දෝෂයක් මතු කරයි. එබැවින් ලබා දී ඇති අගය NaN ද නැද්ද යන්න පරීක්ෂා කර බැලිය නොහැක. පහත දැක්වෙන්නේ මෙම ගැටළුව විසඳන බවයි

if str(x)=='nan' and type(x)!='str':
    print ('NaN')
else:
    print ('non NaN')

0

වර්ගයේ පාවෙන නන් සඳහා

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

-5

පැන්ඩා වල නූල් සඳහා pd.isnull ගන්න:

if not pd.isnull(atext):
  for word in nltk.word_tokenize(atext):

එන්එල්ටීකේ සඳහා විශේෂාංග නිස්සාරණය ලෙස ක්‍රියා කිරීම

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

මෙම අඩු කිරීම සඳහා කුමක් කළ යුතුද?
මැක්ස් ක්ලයිනර්

NaN අගයන් සඳහා පමණක් isnull ප්‍රතිලාභ සත්‍ය වේ.
බොරිස්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.