2009-06-03 2 views
494

float('nan') Результаты Нан (не число). Но как я могу это проверить? Должно быть очень легко, но я не могу найти его.Как я могу проверить NaN в Python?

+16

Для некоторых истории NaN в Python см PEP 754. Http: // www.python.org/dev/peps/pep-0754/ –

+0

'numpy.isnan (numpy.nan)' затем вернет 'True'. И, очевидно, «import numpy» перед этим. :) –

ответ

655

math.isnan()

Проверяет поплавок х является NaN (не число). NaN являются частью стандартов IEEE 754. Операции, такие как, но не ограничиваясь, inf * 0, inf/inf или любая операция с использованием NaN, например. nan * 1, верните NaN.

Новое в версии 2.6.

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

новый в версии 2.6 – gimel

+3

это не удается, если строка, которая тестируется как число, не является числом. Необходимо использовать isdigit в этих случаях. – Joel

+0

Обратите внимание, что это работает одинаково с 'float (" nan ")', как это происходит с 'numpy.core.numeric.NaN', в то время как сравнение двух с' is' не работает. Следовательно, это может быть предпочтительное решение в коде (legacy?), Возможно содержащее оба определения, если я не ошибаюсь? – jhin

186

Обычный способ проверить на NaN, чтобы увидеть, если он равен самому себе:

def isNaN(num): 
    return num != num 
+8

Слово предупреждения: цитируя комментарий медведя ниже «Для людей, застрявших с python <= 2.5. Nan! = Nan не работает надежно. Вместо этого используется numpy». Сказав это, я на самом деле никогда не видел, чтобы он терпел неудачу. – mavnn

+12

Я уверен, что, учитывая перегрузку оператора, есть много способов, которыми я мог бы смутить эту функцию. перейдите с помощью math.isnan() – djsadinoff

+3

В упомянутой выше спецификации 754 указано, что NaN == NaN всегда должно быть ложным, хотя оно не всегда реализуется как таковое. Разве это невозможно, так как математика и/или numpy проверяют это под капотом в любом случае? –

14

math.isnan()

или сравнить число себе. NaN всегда! = NaN, в противном случае (например, если оно равно номер), сравнение должно быть успешным.

+5

Для людей, застрявших с python <= 2.5. Нань! = Нэн не работал надежно. Вместо этого используется numpy. – Bear

70

numpy.isnan(number) сообщает, что это NaN или нет в Python 2.5.

+1

Спасибо, застрял с 2.5, это то, что мне нужно – wich

+2

Работает в версии python версии 2.7 тоже. –

+5

'numpy.all (numpy.isnan (data_list))' также полезна, если вам нужно определить, есть ли все элементы в списке nan – j4y

9

Другой метод, если вы застряли на < 2.6, вы не имеете NumPy, и у вас нет IEEE 754 поддержка:

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

С питоном < 2,6 я закончил с

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

Это работает для меня с питоном 2.5.1 на коробке Solaris 5.9 и питона 2.6.5 на Ubuntu 10

+4

Это не слишком портативно, поскольку Windows иногда вызывает это '-1. # IND' –

6

Ну, я вошел в этот пост, потому что я имел некоторые проблемы с фу nction:

math.isnan() 

Есть проблема при запуске этого кода:

a = "hello" 
math.isnan(a) 

Это вызывает исключение. Мое решение для того, чтобы сделать еще один чек:

def is_nan(x): 
    return isinstance(x, float) and math.isnan(x) 
+0

Почему downvote? –

+1

Возможно, это было опущено, потому что isnan() принимает float, а не строку. В этой функции нет ничего плохого, и проблемы связаны только с его попыткой ее использования. (Для этого конкретного случая использования его решение действительно, но это не ответ на этот вопрос.) –

+4

Будьте осторожны с проверкой типов таким образом. Это не будет работать, например. для numpy.float32 NaN. Лучше использовать Try/за исключением строительства: определение функции is_nan (х): попытка: возвращение math.isnan (х) кроме: возвращение false' – Rob

20

Я на самом деле просто врезался в это, но для меня это была проверка на нан, -INF или инф. Я просто использовал

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

Это справедливо для чисел, ложно для нан и как инф, и возбудит исключение для таких вещей, как строки или других типов (которые, вероятно, хорошая вещь). Также это не требует импорта каких-либо библиотек, таких как математика или numpy (numpy настолько проклят, что он удваивает размер любого скомпилированного приложения).

+5

'math.isfinite' не была введена до Python 3.2, поэтому, учитывая ответ от @DaveTheScientist, был опубликован в 2012 году, изобретать колесо »- решение по-прежнему стоит тем, кто работает с Python 2. –

1

Я получаю данные с веб-службы, которая отправляет 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 
+0

или' try: int (value) ' – chwi

+0

@chwi, так что ваше предложение говорит о том, что' value' является 'NaN' или нет? – Mahdi

+0

Ну, будучи «не числом», все, что нельзя отличить от int, я предполагаю, что на самом деле это не число, и утверждение try не получится? Попробуйте, верните true, кроме return false. – chwi

1

Все методы, чтобы сказать, если переменная является NaN или None:

Нет Тип

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

NaN тип

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 
4

здесь ответ работает с:

  • питона неуникальным NaN: float('nan')
  • Numpy уникальный NaN (Singleton): np.nan
  • любые другие объекты: строка или что-то еще (не вызывает исключений, если встречается)

Здесь:

import numpy as np 

def is_nan(x): 
    return (x is np.nan or x != x) 

И некоторые примеры:

values = [float('nan'), np.nan, 55, "string", lambda x : x] 
for value in values: 
    print "{:<8} : {}".format(repr(value), is_nan(value)) 

Выход:

nan  : True 
nan  : True 
55  : False 
'string' : False 
<function <lambda> at 0x000000000927BF28> : False 
Смежные вопросы