@ charlie-parker: В Python3 файл math.isnan по-прежнему является частью математического модуля. docs.python.org/3/library/math.html#math.isnan . Используйте numpy.isnan, если хотите, этот ответ - просто предложение.
является math.isnanпредпочтительным , чтобы np.isnan()?
TMWP
34
@TMWP возможно ... import numpyзанимает около 15 МБ ОЗУ, тогда как import mathзанимает около 0,2 МБ
petrpulc
9
@TMWP: Если вы используете NumPy, numpy.isnanэто лучший выбор, поскольку он обрабатывает массивы NumPy. Если вы не используете NumPy, нет смысла брать зависимость NumPy и тратить время на загрузку NumPy только для проверки NaN (но если вы пишете код, выполняющий проверки NaN, вероятно, вам следует использовать NumPy).
user2357112 поддерживает Монику
360
Обычный способ проверить NaN - посмотреть, равен ли он самому себе:
Слово предупреждения: процитируйте комментарий Медведя ниже: «Для людей, которые застряли на питоне <= 2.5. Nan! = Nan не работал надежно. Вместо этого использовал numpy». Сказав это, я на самом деле никогда не видел, чтобы это провалилось.
mavnn
22
Я уверен, что, учитывая перегрузку операторов, я могу перепутать эту функцию. перейти с math.isnan ()
djsadinoff
4
В спецификации 754, упомянутой выше, говорится, что NaN == NaN всегда должно быть ложным, хотя это не всегда реализовано как таковое. Разве это не возможно, вот как математика и / или тупица проверяют это под капотом?
Хари Ганесан
Спасибо . это также в 15-20 раз быстрее, чем использование np.isnan при выполнении операции над скаляром
thomas.mac
5
Хотя это работает и, в некоторой степени, имеет смысл, я человек с принципами и настоящим заявляю, что это запрещено колдовством. Пожалуйста, используйте вместо этого math.isnan.
Гонсало
152
numpy.isnan(number)говорит вам, если это NaNили нет.
numpy.all(numpy.isnan(data_list))также полезно , если вам нужно определить , если все элементы в списке нан
Jay P.
3
Нет необходимости в NumPy:all(map(math.isnan, [float("nan")]*5))
sleblanc
6
Когда этот ответ был написан 6 лет назад, Python 2.5 все еще широко использовался - и math.isnan не был частью стандартной библиотеки. Сейчас я очень надеюсь, что это не так во многих местах!
мавн
4
обратите внимание, что np.isnan () не обрабатывает десятичный. десятичный тип (как и многие функции numpy). math.isnan () действительно обрабатывает.
конт
55
Вот три способа, где вы можете проверить переменную "NaN" или нет.
import pandas as pdimport numpy as npimport math#For single variable all three libraries return single boolean
x1 = float("nan")print(f"It's pd.isna : {pd.isna(x1)}")print(f"It's np.isnan : {np.isnan(x1)}")print(f"It's math.isnan : {math.isnan(x1)}")
pd.isna (значение) спасло много неприятностей! работает как шарм!
abhishake
1
ps.isna()решает мои проблемы. Спасибо!
Дартбхирава
32
Вот ответ, работающий с:
Реализации NaN, соответствующие стандарту IEEE 754
то есть: питона NaN: float('nan'), numpy.nan...
любые другие объекты: строка или что-то еще (не вызывает исключений, если встречаются)
NaN, реализованный в соответствии со стандартом, является единственным значением, для которого сравнение неравенства с самим собой должно возвращать значение True:
def is_nan(x):return(x != x)
И несколько примеров:
import numpy as np
values =[float('nan'), np.nan,55,"string",lambda x : x]for value in values:print(f"{repr(value):<8} : {is_nan(value)}")
Вывод:
nan :True
nan :True55:False'string':False<function <lambda> at 0x000000000927BF28>:False
Ряд, который я проверяю, это строки с отсутствующими значениями 'nans' (???), поэтому это решение работает там, где другие не сработали.
Keithpjolley
numpy.nanэто обычный floatобъект Python , такой же, как вид, возвращаемый float('nan'). Большинство NaN, с которыми вы сталкиваетесь в NumPy, не будут numpy.nanобъектами.
user2357112 поддерживает Монику
numpy.nanопределяет его значение NaN по себе в базовой библиотеке C . Это не обернуть NaN питона. Но теперь они оба соответствуют стандарту IEEE 754, поскольку полагаются на C99 API.
x0s
@ user2357112supportsMonica: Python и NumPy NaN на самом деле не ведут себя одинаково: float('nan') is float('nan')(не уникально) и np.nan is np.nan(уникально)
x0s
@ x0s: Это не имеет ничего общего с NumPy. np.nanявляется конкретным объектом, в то время как каждый float('nan')вызов создает новый объект. Если бы вы сделали nan = float('nan'), то вы бы nan is nanтоже. Если бы вы создали настоящий NumPy NaN с чем-то вроде этого np.float64('nan'), вы бы np.float64('nan') is not np.float64('nan')тоже получили .
user2357112 поддерживает Монику
28
Я на самом деле просто столкнулся с этим, но для меня это была проверка для nan, -inf или inf. Я просто использовал
if float('-inf')< float(num)< float('inf'):
Это верно для чисел, false для nan и обоих inf, и вызовет исключение для таких вещей, как строки или другие типы (что, вероятно, хорошо). Также это не требует импорта каких-либо библиотек, таких как математика или numpy (numpy настолько чертовски большой, что удваивает размер любого скомпилированного приложения).
math.isfiniteне был представлен до Python 3.2, поэтому, учитывая, что ответ от @DaveTheScientist был опубликован в 2012 году, он не был «заново изобретать [колесо]» - решение по-прежнему
Вероятно, это было отклонено, потому что isnan () принимает число с плавающей точкой, а не строку. В этой функции нет ничего плохого, и проблемы заключаются только в его попытке использовать ее. (Для этого конкретного варианта использования его решение является действительным, но это не ответ на этот вопрос.)
Питер Хансен
6
Будьте осторожны с проверкой типов таким способом. Это не будет работать, например, для numpy.float32 NaN. Лучше использовать попытку / кроме конструкции: def is_nan(x): try: return math.isnan(x) except: return False
Роб
3
NaN не означает, что значение не является допустимым числом. Это часть представления IEEE с плавающей запятой, указывающая, что конкретный результат не определен. например, 0 / 0. Поэтому спрашивать, является ли "привет" значением nan, бессмысленно.
Брайс М. Демпси
2
это лучше, потому что NaN может приземлиться в любом списке строк, целых чисел или чисел с плавающей запятой, поэтому полезная проверка
RAFIQ
Мне пришлось реализовать именно это для обработки строковых столбцов в пандах.
Кристиан Гарсия
7
С питоном <2.6 я закончил с
def isNaN(x):return str(float(x)).lower()=='nan'
Это работает для меня с python 2.5.1 на коробке Solaris 5.9 и с python 2.6.5 на Ubuntu 10
Это не слишком портативно, поскольку Windows иногда называет это-1.#IND
Mike T
5
Я получаю данные от веб-сервиса, который отправляет NaNв виде строки 'Nan'. Но в моих данных могут быть и другие типы строк, поэтому простое float(value)может вызвать исключение. Я использовал следующий вариант принятого ответа:
def isnan(value):try:import math
return math.isnan(float(value))except:returnFalse
@chwi, так что говорит твое предложение о valueсуществовании NaNили нет?
Махди
Что ж, будучи «не числом», все, что не может быть преобразовано в int, я полагаю, на самом деле не число, и оператор try не выполнится? Попробуйте вернуть true, кроме возврата false.
Чу
@chwi Ну, если понимать буквально «не число», вы правы, но здесь дело не в этом. На самом деле, я ищу именно то, что такое семантика NaN(как в Python, что вы могли бы получить float('inf') * 0), и, следовательно, хотя строка «Hello» не является числом, но это также не NaNпотому, что NaNпо-прежнему числовое значение!
Махди
@chwi: Вы правы, если обработка исключений предназначена для конкретного исключения. Но в этом ответе были обработаны общие исключения. Так что не нужно проверять int(value)За всеми исключениями, Falseбудет написано.
Харша Бияни
3
Все методы, чтобы определить, является ли переменная NaN или нет:
Ни один тип
In[1]:from numpy import math
In[2]: a =NoneIn[3]:not a
Out[3]:TrueIn[4]: len(a or())==0Out[4]:TrueIn[5]: a ==NoneOut[5]:TrueIn[6]: a isNoneOut[6]:TrueIn[7]: a != a
Out[7]:FalseIn[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)==0Traceback(most recent call last):File"<ipython-input-10-65b72372873e>", line 1,in<module>
len(a)==0TypeError: 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]:FalseIn[14]: b != b
Out[14]:TrueIn[15]: math.isnan(b)Out[15]:True
Как удалить NaN (float) элемент (ы) из списка смешанных типов данных
Если вы смешали типы в итерируемом, вот решение, которое не использует numpy:
from math import isnan
Z =['a','b', float('NaN'),'d', float('1.1024')][x for x in Z ifnot(
type(x)== float # let's drop all float values…and isnan(x)# … but only if they are nan)]
['a', 'b', 'd', 1.1024]
Оценка короткого замыкания означает, что isnanона не будет вызываться для значений, которые не относятся к типу 'float', поскольку False and (…)быстро оценивается Falseбез необходимости оценивать правую часть.
В Python 3.6 проверка строкового значения x math.isnan (x) и np.isnan (x) вызывает ошибку. Поэтому я не могу проверить, является ли данное значение NaN или нет, если я не знаю заранее, это число. Следующее, кажется, решить эту проблему
if str(x)=='nan'and type(x)!='str':print('NaN')else:print('non NaN')
>>>import pandas as pd
>>> value = float(nan)>>> type(value)>>><class'float'>>>> pd.isnull(value)True>>>>>> value ='nan'>>> type(value)>>><class'str'>>>> pd.isnull(value)False
ifnot pd.isnull(atext):for word in nltk.word_tokenize(atext):
функция как извлечение признаков для NLTK
def act_features(atext):
features ={}ifnot pd.isnull(atext):for word in nltk.word_tokenize(atext):if word notin default_stopwords:
features['cont({})'.format(word.lower())]=Truereturn features
Ответы:
math.isnan (х)
источник
math.isnan
предпочтительным , чтобыnp.isnan()
?import numpy
занимает около 15 МБ ОЗУ, тогда какimport math
занимает около 0,2 МБnumpy.isnan
это лучший выбор, поскольку он обрабатывает массивы NumPy. Если вы не используете NumPy, нет смысла брать зависимость NumPy и тратить время на загрузку NumPy только для проверки NaN (но если вы пишете код, выполняющий проверки NaN, вероятно, вам следует использовать NumPy).Обычный способ проверить NaN - посмотреть, равен ли он самому себе:
источник
numpy.isnan(number)
говорит вам, если этоNaN
или нет.источник
numpy.all(numpy.isnan(data_list))
также полезно , если вам нужно определить , если все элементы в списке нанall(map(math.isnan, [float("nan")]*5))
Вот три способа, где вы можете проверить переменную "NaN" или нет.
Вывод
источник
ps.isna()
решает мои проблемы. Спасибо!Вот ответ, работающий с:
float('nan')
,numpy.nan
...NaN, реализованный в соответствии со стандартом, является единственным значением, для которого сравнение неравенства с самим собой должно возвращать значение True:
И несколько примеров:
Вывод:
источник
numpy.nan
это обычныйfloat
объект Python , такой же, как вид, возвращаемыйfloat('nan')
. Большинство NaN, с которыми вы сталкиваетесь в NumPy, не будутnumpy.nan
объектами.numpy.nan
определяет его значение NaN по себе в базовой библиотеке C . Это не обернуть NaN питона. Но теперь они оба соответствуют стандарту IEEE 754, поскольку полагаются на C99 API.float('nan') is float('nan')
(не уникально) иnp.nan is np.nan
(уникально)np.nan
является конкретным объектом, в то время как каждыйfloat('nan')
вызов создает новый объект. Если бы вы сделалиnan = float('nan')
, то вы быnan is nan
тоже. Если бы вы создали настоящий NumPy NaN с чем-то вроде этогоnp.float64('nan')
, вы быnp.float64('nan') is not np.float64('nan')
тоже получили .Я на самом деле просто столкнулся с этим, но для меня это была проверка для nan, -inf или inf. Я просто использовал
Это верно для чисел, false для nan и обоих inf, и вызовет исключение для таких вещей, как строки или другие типы (что, вероятно, хорошо). Также это не требует импорта каких-либо библиотек, таких как математика или numpy (numpy настолько чертовски большой, что удваивает размер любого скомпилированного приложения).
источник
math.isfinite
не был представлен до Python 3.2, поэтому, учитывая, что ответ от @DaveTheScientist был опубликован в 2012 году, он не был «заново изобретать [колесо]» - решение по-прежнемуmath.isnan ()
или сравните число с собой. NaN всегда! = NaN, в противном случае (например , если это число) сравнение должно преуспеть.
источник
Другой метод, если вы застряли на <2.6, у вас нет numpy, и у вас нет поддержки IEEE 754:
источник
Ну, я вошел в этот пост, потому что у меня были некоторые проблемы с функцией:
Есть проблема при запуске этого кода:
Это вызывает исключение. Мое решение для этого состоит в том, чтобы сделать еще одну проверку:
источник
def is_nan(x): try: return math.isnan(x) except: return False
С питоном <2.6 я закончил с
Это работает для меня с python 2.5.1 на коробке Solaris 5.9 и с python 2.6.5 на Ubuntu 10
источник
-1.#IND
Я получаю данные от веб-сервиса, который отправляет
NaN
в виде строки'Nan'
. Но в моих данных могут быть и другие типы строк, поэтому простоеfloat(value)
может вызвать исключение. Я использовал следующий вариант принятого ответа:Требование:
источник
try: int(value)
value
существованииNaN
или нет?NaN
(как в Python, что вы могли бы получитьfloat('inf') * 0
), и, следовательно, хотя строка «Hello» не является числом, но это также неNaN
потому, чтоNaN
по-прежнему числовое значение!int(value)
За всеми исключениями,False
будет написано.Все методы, чтобы определить, является ли переменная NaN или нет:
Ни один тип
Тип NaN
источник
Как удалить NaN (float) элемент (ы) из списка смешанных типов данных
Если вы смешали типы в итерируемом, вот решение, которое не использует numpy:
Оценка короткого замыкания означает, что
isnan
она не будет вызываться для значений, которые не относятся к типу 'float', посколькуFalse and (…)
быстро оцениваетсяFalse
без необходимости оценивать правую часть.источник
В Python 3.6 проверка строкового значения x math.isnan (x) и np.isnan (x) вызывает ошибку. Поэтому я не могу проверить, является ли данное значение NaN или нет, если я не знаю заранее, это число. Следующее, кажется, решить эту проблему
источник
Кажется, что проверка, если он равен самому себе
самый быстрый
источник
источник
для строк в панде беру pd.isnull:
функция как извлечение признаков для NLTK
источник