2011-12-14 11 views
5

Sto cercando di utilizzare NumPy per verificare se un input dell'utente è numerica, Ho provato con:NumPy - Utilizzando isNaN (x)

from numpy import * 

a = input("\n\nInsert A: ") 

if isnan(a) == True: 
    print 'Not a number...' 
else: 
    print "Yep,that's a number" 

Su di essa la propria e funziona benissimo, ma quando ho integrarlo in una funzione come in questo caso:

da import NumPy *

def test_this(a): 

    if isnan(a) == True: 
     print '\n\nThis is not an accepted type of input for A\n\n' 
     raise ValueError 
    else: 
     print "Yep,that's a number" 

a = input("\n\nInsert A: ") 

test_this(a) 

tanto sono un NotImplementationError dicendo che non è implementata per questo tipo, qualcuno può spiegare come questo non funziona?

Qualsiasi aiuto sarebbe molto apprezzato e grazie ancora.

+2

il tuo obiettivo è verificare se il valore immesso dall'utente è un numero valido? –

+0

@SvenMarnach Sì, ho pensato che sarebbe stato meglio usare semplicemente: se type (a)! = Int o type (a)! = Float: –

+3

1. evita 'da numpy import *', potresti 'importare numpy come np' e poi usare 'np.isnan()', ecc. 2. Non confrontare con 'True' direttamente usare' if np.isnan (a) '. 3. 'input()' fa 'eval (raw_input (prompt))' probabilmente non è quello che vuoi. – jfs

risposta

11

"Not a Number" o "NaN" è un tipo speciale di valore in virgola mobile secondo lo standard IEEE-754. Le funzioni numpy.isnan() e math.isnan() prova se un dato numero virgola mobile ha questo valore speciale (o uno dei diversi valori "NaN"). Passando ad un numero qualsiasi di un numero in virgola mobile su una di queste funzioni, si ottiene TypeError.

per fare il tipo di input controllo che si desidera fare, non si dovrebbe usare input(). Invece, utilizzare raw_input(), try: per convertire la stringa restituita ad un float, e gestire l'errore se questo fallisce.

Esempio:

def input_float(prompt): 
    while True: 
     s = raw_input(prompt) 
     try: 
      return float(s) 
     except ValueError: 
      print "Please enter a valid floating point number." 

Come @ J.F. Sebastian ha sottolineato,

input() fa eval(raw_input(prompt)), è molto probabilmente non quello che volete.

O per essere più espliciti, raw_input passa lungo una corda, che una volta inviato a eval saranno valutate e trattati come se fosse comando con il valore dell'ingresso piuttosto che la stringa di input stessa.

0
a = raw_input("\n\nInsert A: ") 

try: f = float(a) 
except ValueError: 
    print "%r is not a number" % (a,) 
else: 
    print "%r is a number" % (a,) 
2

Uno dei modi più onnicomprensivo di controllare se un input dell'utente è un numero valido in Python sta cercando di convertirlo in un valore float, e intercettare l'eccezione.

Come indicato nei commenti e in altre risposte, il controllo per NaN non ha nulla a che fare con un input numerico utente valido, ma controlla se un oggetto numerico ha il valore speciale di Non un numero.

def check_if_numeric(a): 
    try: 
     float(a) 
    except ValueError: 
     return False 
    return True 
0

È possibile controllare il tipo di ingresso direttamente:

a = input("\n\nInsert A: ") 
num_types = ("int", "float", "long", "complex") 

if type(a).__name__ in num_types 
    print "Yep,that's a number"  
else: 
    print '\n\nThis is not an accepted type of input for A\n\n' 
    raise ValueError 
Problemi correlati