NumPy - использование isnan (x) - PullRequest
5 голосов
/ 14 декабря 2011

Я пытаюсь использовать numpy, чтобы проверить, является ли пользовательский ввод числовым, я пытался использовать:

from numpy import *

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

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

Сам по себе, и он работает нормально, однако, когда я встраиваю его в функциюнапример, в этом случае:

из numpy import *

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)

Затем я получаю сообщение NotImplementationError, в котором говорится, что оно не реализовано для этого типа. Может кто-нибудь объяснить, как это не работает?

Любая помощь будет принята с благодарностью и еще раз спасибо.

Ответы [ 4 ]

11 голосов
/ 14 декабря 2011

«Не число» или «NaN» - это особый тип значения с плавающей запятой согласно стандарту IEEE-754.Функции numpy.isnan() и math.isnan() проверяют, имеет ли данное число с плавающей запятой это специальное значение (или одно из нескольких значений «NaN»).Передача чего-либо, кроме числа с плавающей запятой, в одну из этих функций приводит к TypeError.

. Чтобы выполнить проверку ввода, которую вы хотели бы выполнить, вы не должны использовать input().Вместо этого используйте raw_input(), try:, чтобы преобразовать возвращаемую строку в float и обработать ошибку, если это не удалось.

Пример:

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

Как отметил @JF Себастьян,

input() делает eval(raw_input(prompt)), скорее всего, это не то, что вам нужно.

Или, если быть более точным, raw_input передает строку, которая после отправки в eval будет оцениваться и обрабатываться так, как если бы это была команда со значением ввода, а не строкой вводасам.

2 голосов
/ 14 декабря 2011

Один из наиболее распространенных способов проверки, является ли введенный пользователем допустимый номер в Python, пытается преобразовать его в значение с плавающей запятой и перехватить исключение.

Как указано в комментариях и других ответахпроверка на NaN не имеет ничего общего с действительным числовым вводом пользователя - скорее, она проверяет, имеет ли числовой объект специальное значение Not a Number.

def check_if_numeric(a):
   try:
       float(a)
   except ValueError:
       return False
   return True
0 голосов
/ 14 декабря 2011

Вы можете проверить тип ввода напрямую:

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
0 голосов
/ 14 декабря 2011
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,)
...