2011-12-14 14 views
5

Estoy intentando utilizar numpy para comprobar si una entrada de usuario es numérico, He intentado usar:NumPy - Uso 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" 

por sí mismo y sin embargo cuando se trabaja muy bien, me incrustarlo en una función, como en este caso:

de importación 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) 

cuando me siento un NotImplementationError diciendo que no está implementado para este tipo, alguien puede explicar cómo esto no está funcionando?

Cualquier ayuda sería muy apreciada y gracias de nuevo.

+2

es su objetivo para probar si el valor que el usuario introducido es un número válido? –

+0

@SvenMarnach Sí, asumí que sería mejor que usar simplemente: si escribe (a)! = Int o escribe (a)! = Float: –

+3

1. evite 'from numpy import *', podría 'importar numpy como np' y luego use 'np.isnan()', etc. en su lugar. 2. No compare con 'True' directamente use' if np.isnan (a) 'en su lugar. 3. 'input()' hace 'eval (raw_input (prompt))' lo más probable es que no sea lo que quiere. – jfs

Respuesta

11

"No es un número" o "NaN" es un tipo especial de valor de coma flotante según el estándar IEEE-754. Las funciones numpy.isnan() y math.isnan() prueban si un número de coma flotante dado tiene este valor especial (o uno de varios valores "NaN"). Pasar cualquier cosa que no sea un número de coma flotante a una de estas funciones da como resultado un TypeError.

Para realizar el tipo de comprobación de entradas que le gustaría hacer, no debe usar input(). En su lugar, use raw_input(), try: para convertir la cadena devuelta a float, y maneje el error si esto falla.

Ejemplo:

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

Como @ J.F. Sebastián señaló,

input()eval(raw_input(prompt)) hace, es muy probable que no lo desea.

O para ser más explícitos, raw_input pasa a lo largo de una cadena, que una vez enviado a eval serán evaluados y tratados como si se tratara de comandos con el valor de la entrada en lugar de la cadena de entrada en sí.

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

Una de las maneras más abarcador de comprobar si una entrada de usuario es un número válido en Python está tratando de convertirlo en un valor de coma flotante, y detectar la excepción.

Como se indica en los comentarios y otras respuestas, la comprobación de NaN no tiene nada que ver con la entrada numérica de usuario válida, sino que comprueba si un objeto numérico tiene el valor especial de No es un número.

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

Puede comprobar el tipo de entrada directa:

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