আমি কীভাবে এনএএন মানগুলি পরীক্ষা করতে পারি?


979

float('nan')Nan ফলাফল (একটি সংখ্যা নয়)। তবে আমি কীভাবে এটি পরীক্ষা করব? খুব সহজ হওয়া উচিত, তবে আমি এটি খুঁজে পাই না।


20
পাইথনে NaN এর কিছু ইতিহাসের জন্য, PEP 754 দেখুন p পাইথন.আর.দেব
ক্রেগ

উত্তর:


1275

math.isnan (x) এর

TrueX যদি কোনও NaN হয় (সংখ্যা নয়) এবং Falseঅন্যথায় ফিরে আসুন ।

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

5
@ চার্লি-পার্কার: পাইথন 3-এ, ম্যাথ.আইসানান এখনও গণিতের মডিউলের একটি অংশ। docs.python.org/3/library/math.html#math.isnan । আপনি যদি চান তবে numpy.isnan ব্যবহার করুন, এই উত্তরটি কেবল একটি পরামর্শ।
জিমেল

2
@ সিটিংবুল দেখুন docs.python.org/3/library/funitions.html#float "যদি আর্গুমেন্টটি একটি স্ট্রিং হয় তবে এটিতে একটি দশমিক সংখ্যা", বা "অনন্ত" "ইনফ" "ন্যান" থাকতে হবে
জিমেল

35
হয় math.isnanপছন্দ np.isnan()?
TMWP

34
@ টিএমডাব্লুপি সম্ভবত ... import numpyপ্রায় 15 মেগাবাইট র‌্যাম import mathনেয় , যেখানে
0,2

9
@ টিএমডাব্লুপি: আপনি যদি নম্পপি ব্যবহার করেন তবে numpy.isnanএটি একটি সেরা পছন্দ, কারণ এটি নম্পপি অ্যারে পরিচালনা করে। আপনি যদি NumPy ব্যবহার না করে থাকেন তবে NumPy নির্ভরতা নেওয়ার এবং NumPy লোড করতে সময় ব্যয় করার কোনও সুবিধা নেই কেবলমাত্র একটি NaN চেকের জন্য (তবে আপনি যদি এনএএন চেক করে এমন ধরণের কোড লিখছেন তবে সম্ভবত আপনার ব্যবহার করা উচিত NumPy)।
ব্যবহারকারী 2357112

359

কোনও এনএএন পরীক্ষা করার স্বাভাবিক উপায়টি এটি নিজের সমান কিনা তা দেখুন:

def isNaN(num):
    return num != num

8
সতর্কতার শব্দ: নীচে বিয়ারের মন্তব্যটির উদ্ধৃতি দিয়ে "" অজগর দ্বারা আটকে থাকা লোকদের জন্য <= 2.5। ন্যান! = নান নির্ভরযোগ্যভাবে কাজ করেনি instead পরিবর্তে নকল ব্যবহার করেছেন। " এটি বলার পরে, আমি বাস্তবে কখনও এটি ব্যর্থ হতে দেখিনি।
mavnn

22
আমি নিশ্চিত যে অপারেটরকে ওভারলোডিং দেওয়া হচ্ছে, আমি এই ফাংশনটিকে বিভ্রান্ত করতে পারি এমন অনেকগুলি উপায় রয়েছে। গণিত.ইস্নান () এর সাথে যান
ডিজেসাদিনোফ

4
এটি উপরে উল্লিখিত 75৫৪ টি অনুচ্ছেদে বলেছে যে NaN == NaN সর্বদা মিথ্যা হওয়া উচিত, যদিও এটি সর্বদা এর মতো প্রয়োগ হয় না। গণিত এবং / বা নম্পি যেভাবেই হুডের নীচে এটি চেক করে এটি কী সম্ভব নয়?
হরি গণেশান

ধন্যবাদ এটি কোনও স্কেলারের উপর অপারেশন করে এনপি.আইসানান ব্যবহার করার চেয়ে 15-20x গুণ বেশি দ্রুত
থোমাস.ম্যাক

5
যদিও এটি কাজ করে এবং কিছুটা হলেও বোঝায় যে, আমি নীতিগুলি সহ একজন মানুষ এবং আমি এটিকে নিষিদ্ধ ডাইনী যাদু হিসাবে ঘোষণা করি। পরিবর্তে গণিত.ইস্নান ব্যবহার করুন।
গনজালো

151

numpy.isnan(number)আপনাকে বলে যদি তা NaNনা হয়।


3
পাইথন সংস্করণ ২.7-এও কাজ করে।
মিশেল কেইজজার্স

6
numpy.all(numpy.isnan(data_list))তালিকার সমস্ত উপাদান ন্যান কিনা তা নির্ধারণ করতে আপনার যদি প্রয়োজন হয় তাও দরকারী
জে পি।

3
all(map(math.isnan, [float("nan")]*5))
নুমপাইয়ের

6
এই উত্তরটি যখন 6 বছর আগে লেখা হয়েছিল তখন পাইথন 2.5 2.5 এখনও প্রচলিত ছিল - এবং গণিত.ইস্নান স্ট্যান্ডার্ড লাইব্রেরির অংশ ছিল না। এখনকার দিনগুলিতে আমি সত্যিই আশা করছি যে এটি অনেক জায়গায় ঘটেনি!
mavnn

4
মনে রাখবেন যে এনপি.ইসানান () দশমিকটি হ্যান্ডেল করে না ec math.isnan () হ্যান্ডেল করে।
comte

55

এখানে তিনটি উপায় যেখানে আপনি ভেরিয়েবল পরীক্ষা করতে পারবেন তা হল "NaN" বা না or

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

2
pd.isna (মান) অনেক ঝামেলা বাঁচিয়েছে! মোহন মত কাজ!
অভিষেক

1
ps.isna()আমার সমস্যাগুলি সমাধান করে ধন্যবাদ!
দর্থভিরব

32

এখানে একটি উত্তর সাথে কাজ করছে:

  • আইএনইই 754 মানকে সম্মান করে NaN বাস্তবায়ন
    • অর্থাৎ, পাইথন এর নান: float('nan'), numpy.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 এর মুখোমুখি বেশিরভাগ NaN numpy.nanঅবজেক্ট হবেন না ।
ব্যবহারকারী 2357112 মনিকা

numpy.nanসি এর অন্তর্নিহিত লাইব্রেরিতে নিজের এনএএন মানটি সংজ্ঞায়িত করে । এটি পাইথনের এনএএন মোড়কে দেয় না। তবে এখন, তারা দুজনেই আইইইই 754 স্ট্যান্ডার্ডের সাথে সম্মতি দেয় কারণ তারা সি 99 এপিআইয়ের উপর নির্ভর করে।
x0s

@ ব্যবহারকারী 2357112 সাপোর্টমোনিকা: পাইথন এবং ন্যাপি এনএএন আসলে একইভাবে আচরণ করে না: float('nan') is float('nan')(অদ্বিতীয়) এবং np.nan is np.nan(অনন্য)
x0

@ x0s: নম্পপির সাথে এর কোনও যোগসূত্র নেই। np.nanএকটি নির্দিষ্ট বস্তু, যখন প্রতিটি float('nan')কল একটি নতুন অবজেক্ট তৈরি করে। আপনি যদি তা করেন nan = float('nan')তবে nan is nanআপনিও পেয়ে যাবেন । আপনি যদি এমন কোনও কিছু দিয়ে একটি আসল নুমপি এনএএন তৈরি করেন np.float64('nan')তবে আপনিও পেয়ে যাবেনnp.float64('nan') is not np.float64('nan')
ব্যবহারকারী 2357112 মনিকা

28

আমি আসলে এটির মধ্যে দৌড়েছি, তবে আমার জন্য এটি ন্যান, -আইএনএফ বা ইনফের জন্য অনুসন্ধান করা হয়েছিল। আমি সবেমাত্র ব্যবহার করেছি

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

এটি সংখ্যার ক্ষেত্রে সত্য, নান এবং উভয়ই ইনফের জন্য মিথ্যা, এবং স্ট্রিং বা অন্যান্য ধরণের (যা সম্ভবত একটি ভাল জিনিস) এর মতো জিনিসের ব্যতিক্রম বাড়িয়ে তুলবে। এছাড়াও এর জন্য ম্যাথ বা নিম্পির মতো কোনও লাইব্রেরি আমদানির প্রয়োজন হয় না (নিম্পি এতটাই জঘন্য যে এটি কোনও সংকলিত অ্যাপ্লিকেশনটির আকার দ্বিগুণ করে)।


9
math.isfiniteপাইথন ৩.২ অবধি প্রবর্তন করা হয়নি, সুতরাং @ ডেভ দ্য সায়েন্টিস্টের উত্তরটি ২০১২-এ পোস্ট করা হয়েছিল এটি হুবহু "পুনরুদ্ধার [আইং] করা হয়নি" - সমাধানটি আজও পাইথন ২ এর সাথে যারা কাজ করছেন তাদের পক্ষে সমাধান রয়েছে
সুডো_কফি

22

math.isnan ()

অথবা সংখ্যাটি নিজের সাথে তুলনা করুন। NaN সবসময় হয়! = নান অন্যথায় (যেমন যদি এটা হয় একটি সংখ্যা) তুলনা সফল করা উচিত নয়।


6
অজগর দ্বারা আটকে থাকা লোকদের জন্য <= 2.5। ন্যান! = নান নির্ভরযোগ্যভাবে কাজ করেনি। পরিবর্তে অদ্ভুত ব্যবহৃত।
বিয়ার

16

আপনি যদি <2.6 এ আটকে থাকেন তবে অন্য পদ্ধতি, আপনার অলস নেই এবং আপনার কাছে আইইইই 754 সমর্থন নেই:

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

11

ঠিক আছে আমি এই পোস্টে প্রবেশ করলাম, কারণ আমি ফাংশন নিয়ে কিছু সমস্যা ছিল:

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
NaN এর অর্থ এই নয় যে কোনও মান একটি বৈধ সংখ্যা নয়। নির্দিষ্ট ফলাফল অপরিবর্তিত রয়েছে তা নির্দিষ্ট করতে এটি আইইইই ভাসমান পয়েন্ট উপস্থাপনার অংশ। উদাহরণস্বরূপ 0 / 0. সুতরাং "হ্যালো" ন্যান কিনা তা জিজ্ঞাসা করা অর্থহীন।
ব্রাইস এম। ডেম্পসে

2
এটি আরও ভাল কারণ
এনএএন

8

পাইথনের সাথে <2.6 আমি শেষ করেছি

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

এটি আমার পক্ষে সোলারিস ৫.৯ বাক্সে অজগর ২.২.১ এবং উবুন্টু 10-তে পাইথন ২.6.৫ সহ কাজ করে


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)
চবি

@ চবি তাই আপনার পরামর্শটি valueথাকার NaNবা না থাকার বিষয়ে কী বলে ?
মাহদি

ওয়েল, "একটি সংখ্যা নয়", এমন কোনও কিছু যা আমার অনুমান অনুসারে কাস্ট করা যায় না এটি আসলে একটি সংখ্যা নয়, এবং চেষ্টা বিবৃতি ব্যর্থ হবে? মিথ্যা প্রত্যাবর্তন বাদে সত্যের দিকে ফিরে আসার চেষ্টা করুন।
চবি

@ চবি ঠিক আছে, "সংখ্যার নয়" আক্ষরিক অর্থে, আপনি ঠিক বলেছেন, তবে এটি এখানে মূল বিষয় নয়। আসলে, আমি ঠিক করছি কি শব্দার্থবিদ্যা NaNIs (পাইথন মত কি আপনি থেকে পেতে পারে float('inf') * 0), এবং এইভাবে যদিও STRING 'হ্যালো' একটি সংখ্যা নয়, কিন্তু এটি নয় NaNকারণ NaNএখনও একটি সাংখ্যিক মান হয়!
মাহদী

@ চবি: আপনি সঠিক, যদি ব্যতিক্রম হ্যান্ডলিং নির্দিষ্ট ব্যতিক্রম হয়। তবে এই উত্তরে জেনেরিক ব্যতিক্রমগুলি পরিচালনা করা হয়েছে। সুতরাং int(value)সব ব্যতিক্রম জন্য চেক করার প্রয়োজন নেই , Falseলেখা হবে।
হর্ষ বিয়ানি

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

ন্যান টাইপ

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
                      )]
['এ', 'বি', 'ডি', ১.১০২৪]

শর্ট সার্কিট মূল্যায়ন মানে ডান হাতের মূল্যায়ন না করে দ্রুত মূল্যায়ন করার সাথে সাথে isnan'ভাসা' টাইপের নয় এমন মানগুলিতে ডাকা হবে না ।False and (…)False


1

পাইথন ৩.6-তে স্ট্রিং মান 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

পান্ডায় স্ট্রিংয়ের জন্য পিডি নিন।স্নুল:

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

এই হ্রাস কি?
সর্বাধিক ক্লিনার

isnull শুধুমাত্র NaN মানগুলির জন্যই সত্য প্রত্যাবর্তন করে।
বোরিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.