क्या NaN या अनंत के लिए एक संख्या निर्धारित करना संभव है?


202

क्या NaNपायथन में किसी ऐरे के तत्व को सेट करना संभव है ?

इसके अतिरिक्त, क्या यह संभव है कि एक चर +/- अनंत तक सेट किया जाए? यदि हां, तो क्या यह जांचने के लिए कोई फ़ंक्शन है कि कोई संख्या अनंत है या नहीं?


3
stackoverflow.com/questions/944700 आपको बताता है कि NaN की जाँच कैसे करें। Inf -Inf के लिए आप == के साथ परीक्षण कर सकते हैं, लेकिन यह NaN के लिए IEEE754 नियमों के कारण NaN के लिए काम नहीं करता है।
डेविड हेफर्नन

मुझे लगता है कि सबसे विश्वसनीय तरीका उचित कार्यों का उपयोग करना है जैसे कि isinfऔर isnanद्वारा प्रदान किया गया है numpy। नीचे मेरा जवाब देखें।
ओलिवियर वर्डियर 14

जवाबों:


271

तार का उपयोग करके कास्ट करें float():

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

1
यह मुझे दूसरी बार प्रश्न पढ़ने से पहले एक चुटकी के साथ नहीं कूदना सिखाएगा !! माफ़ करना! यह कहा गया है, यह सब एक ही कहना दुख नहीं होगा क्योंकि यह NaN में गिर करने के लिए एक आसान जाल है! = NaN
डेविड Heffernan

2
यह भी नोट करें: >>> फ्लोट ('इन्फ') - फ्लोट ('इन्फ') ===> नान
एनटीजी

76

हां, आप इसके लिए उपयोग कर सकते हैं numpy

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
अजगर पर = = 2.6, आप बस का उपयोग कर सकते हैं math.isnan()औरmath.isinf()
Agos

8
numpyकाफी भारी आयात है अगर आप सभी चाहते हैं NaNयाinf
cz

1
यदि आप सभी की जरूरत है NaNया Inf, from numpy import nan, infजो इस सवाल के बाद से अस्तित्व में था सकता है ।
andrewgu

37

क्या NaN या अनंत के लिए एक संख्या निर्धारित करना संभव है?

हां, वास्तव में कई तरीके हैं। बिना किसी आयात के कुछ काम, जबकि अन्य की आवश्यकता होती हैimport , हालांकि इस उत्तर के लिए मैं अवलोकन में पुस्तकालयों को मानक-पुस्तकालय और न्यूमपी (जो मानक-पुस्तकालय नहीं है, लेकिन एक बहुत ही सामान्य तृतीय-पक्ष पुस्तकालय है) तक सीमित कर दूंगा।

निम्न तालिका उन तरीकों को संक्षेप में बताती है कि कोई एक नंबर या एक सकारात्मक या नकारात्मक अनंत कैसे बना सकता है 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    
╘══════════╧══════════════╧════════════════════╧════════════════════╛

एक मेज के लिए कुछ टिप्पणी:

  • floatनिर्माता, वास्तव में केस-संवेदी है, इसलिए आप भी उपयोग कर सकते हैं float("NaN")याfloat("InFiNiTy")
  • cmathऔर numpyस्थिरांक सादे पायथन लौट floatवस्तुओं।
  • numpy.NINFवास्तव में केवल निरंतर मुझे लगता है कि के बारे में पता की आवश्यकता नहीं है है -
  • यह के साथ जटिल NaN और इन्फिनिटी बनाने के लिए संभव है complexऔर 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           
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛

    The के साथ विकल्प एक सादा लौटते हैं float, ए नहीं complex

क्या यह जांचने के लिए कोई फ़ंक्शन है कि कोई संख्या अनंत है या नहीं?

हाँ वहाँ है - वास्तव में NaN, Infinity और न तो Nan और न ही Inf के लिए कई कार्य हैं। हालांकि ये पूर्वनिर्धारित कार्य अंतर्निहित नहीं हैं, उन्हें हमेशा एक की आवश्यकता होती है 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     
╘══════════╧═════════════╧════════════════╧════════════════════╛

फिर से कुछ टिप्पणी:

  • cmathऔरnumpy कार्य भी, जटिल वस्तुओं के लिए काम करता है, तो वास्तविक या काल्पनिक हिस्सा NaN या इन्फिनिटी है वे जाँच करेगा।
  • numpyभी कार्य के लिए काम करते numpyसरणियों और सब कुछ है कि (सूचियों, टपल, आदि) एक के लिए परिवर्तित किया जा सकता
  • ऐसे कार्य भी हैं जो स्पष्ट रूप से पॉम्पी में सकारात्मक और नकारात्मक अनंतता के लिए जाँच करते हैं: numpy.isposinfऔर numpy.isneginf
  • पंडों के लिए जाँच करने के लिए दो अतिरिक्त कार्य प्रदान करते हैं NaN: pandas.isnaऔर pandas.isnull(लेकिन NaN ही नहीं, यह भी मेल खाता है Noneऔर NaT)
  • भले ही कोई अंतर्निहित कार्य नहीं हैं, फिर भी उन्हें स्वयं बनाना आसान होगा (मैंने यहाँ टाइप जाँच और प्रलेखन की उपेक्षा की):

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

इन कार्यों के लिए अपेक्षित परिणामों को संक्षेप में प्रस्तुत करना (इनपुट फ्लोट है)

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

क्या पायथन में NaN के लिए एक सरणी का एक तत्व सेट करना संभव है?

एक सूची में यह कोई समस्या नहीं है, आप हमेशा NaN (या इन्फिनिटी) को वहां शामिल कर सकते हैं:

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

लेकिन यदि आप एक में शामिल करना चाहते हैं array(उदाहरण के लिए array.arrayया numpy.array) तो सरणी के प्रकार चाहिए हो floatया complexक्योंकि अन्यथा यह सरणियों प्रकार के लिए यह खिन्न करने की कोशिश करेंगे!

>>> 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
नोट: math.isnanजटिल संख्याओं के साथ काम नहीं करता है। math.isnan(x.real) or math.isnan(x.imag)इसके बजाय उपयोग करें ।
जोनाथन एच।

2

पायथन 2.4 का उपयोग करते समय, प्रयास करें

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

मैं उस मुद्दे का सामना कर रहा हूं जब मैं सिम्पलसन को एक एम्बेडेड डिवाइस में पोर्ट कर रहा था जो पायथन 2.4 को चला रहा था, float("9e999")इसे ठीक कर दिया। उपयोग न करें inf = 9e999, आपको इसे स्ट्रिंग से परिवर्तित करने की आवश्यकता है। -infदेता है -Infinity

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.