Можно ли установить число в NaN или бесконечность?
203
Можно ли установить элемент массива NaNв Python?
Кроме того, возможно ли установить переменную на +/- бесконечность? Если да, есть ли какая-нибудь функция для проверки, является ли число бесконечным или нет?
stackoverflow.com/questions/944700 рассказывает, как проверить наличие NaN. Для Inf и -Inf вы можете протестировать с ==, но это не работает для NaN из-за правил IEEE754 для NaN.
Дэвид Хеффернан
Я думаю, что самый надежный способ - это использовать правильные функции, как isinfи isnanкак предусмотрено numpy. Смотрите мой ответ ниже.
Это научит меня не впадать в шутку, прежде чем читать вопрос снова! Сожалею! Тем не менее, это не мешало бы сказать так же, потому что это легкая ловушка, в которую можно попасть, NaN! = NaN
Дэвид Хеффернан
2
также обратите внимание: >>> float ('Inf') - float ('Inf') ===> nan
import numpy as np
a = arange(3,dtype=float)
a[0]= np.nan
a[1]= np.inf
a[2]=-np.inf
a # is now [nan,inf,-inf]
np.isnan(a[0])# True
np.isinf(a[1])# True
np.isinf(a[2])# True
На python> = 2.6 вы можете просто использовать math.isnan()иmath.isinf()
Agos
8
numpyдовольно тяжелый импорт, если все, что вы хотите, NaNилиinf
cz
1
Если все, что вам нужно, это NaNили Inf, можно, from numpy import nan, infкоторый существовал после того, как этот вопрос был поднят.
Андрей
37
Можно ли установить число в NaN или бесконечность?
Да, на самом деле есть несколько способов. Некоторые из них работают без какого-либо импорта, в то время как другие требуют import, однако для этого ответа я ограничу библиотеки в обзоре стандартной библиотекой и NumPy (который не является стандартной библиотекой, а очень распространенной сторонней библиотекой).
В следующей таблице приведены способы, как можно создать не число или положительную или отрицательную бесконечность float:
Опции с ¹ возвращают обычный float, а не a complex.
есть ли функция, чтобы проверить, является ли число бесконечностью или нет?
Да, есть - на самом деле есть несколько функций для NaN, Infinity и ни Nan, ни Inf. Однако эти предопределенные функции не являются встроенными, они всегда требуют import:
cmathиnumpy также работают для сложных объектов, они проверят, является ли действительная или мнимая часть NaN или Бесконечностью.
Эти numpyфункции также работаютnumpy массивов и все , что может быть преобразованы в один (например , списки, кортеж и т.д.)
Есть также функции, которые явно проверяют положительную и отрицательную бесконечность в NumPy: numpy.isposinfиnumpy.isneginf .
Pandas предлагает две дополнительные функции для проверки NaN: pandas.isnaи pandas.isnull(но не только NaN, он также соответствует Noneи NaT)
Несмотря на то, что встроенных функций нет, было бы легко создать их самостоятельно (здесь я пренебрег проверкой типов и документацией):
def isnan(value):return value != value # NaN is not equal to anything, not even itself
infinity = float("infinity")def isinf(value):return abs(value)== infinity
def isfinite(value):returnnot(isnan(value)or isinf(value))
Подводя итоги ожидаемых результатов для этих функций (при условии, что входные данные являются числами с плавающей запятой):
Однако, если вы хотите включить его в array(например, array.arrayили numpy.array), тогда тип массива должен быть floatили complexпотому что в противном случае он попытается уменьшить его до типа массива!
Примечание: math.isnanне работает с комплексными числами. Используйте math.isnan(x.real) or math.isnan(x.imag)вместо этого.
Джонатан Х
2
При использовании Python 2.4, попробуйте
inf = float("9e999")
nan = inf - inf
Я столкнулся с проблемой, когда я портировал simplejson на встроенное устройство, на котором работал Python 2.4, float("9e999")исправил его. Не используйте inf = 9e999, вам нужно преобразовать его из строки.
-infдает -Infinity.
isinf
иisnan
как предусмотреноnumpy
. Смотрите мой ответ ниже.Ответы:
Приведение из строки с использованием
float()
:источник
Да, вы можете использовать
numpy
для этого.источник
math.isnan()
иmath.isinf()
numpy
довольно тяжелый импорт, если все, что вы хотите,NaN
илиinf
NaN
илиInf
, можно,from numpy import nan, inf
который существовал после того, как этот вопрос был поднят.Да, на самом деле есть несколько способов. Некоторые из них работают без какого-либо импорта, в то время как другие требуют
import
, однако для этого ответа я ограничу библиотеки в обзоре стандартной библиотекой и NumPy (который не является стандартной библиотекой, а очень распространенной сторонней библиотекой).В следующей таблице приведены способы, как можно создать не число или положительную или отрицательную бесконечность
float
:Пара замечаний к столу:
float
Конструктор на самом деле не чувствителен к регистру, поэтому вы можете также использоватьfloat("NaN")
илиfloat("InFiNiTy")
.cmath
иnumpy
возвращают простыеfloat
объекты Python .numpy.NINF
самом деле это единственная известная мне константа, которая не требует-
.Можно создать комплекс NaN и Infinity с
complex
иcmath
:Опции с ¹ возвращают обычный
float
, а не acomplex
.Да, есть - на самом деле есть несколько функций для NaN, Infinity и ни Nan, ни Inf. Однако эти предопределенные функции не являются встроенными, они всегда требуют
import
:Опять пара замечаний:
cmath
иnumpy
также работают для сложных объектов, они проверят, является ли действительная или мнимая часть NaN или Бесконечностью.numpy
функции также работаютnumpy
массивов и все , что может быть преобразованы в один (например , списки, кортеж и т.д.)numpy.isposinf
иnumpy.isneginf
.NaN
:pandas.isna
иpandas.isnull
(но не только NaN, он также соответствуетNone
иNaT
)Несмотря на то, что встроенных функций нет, было бы легко создать их самостоятельно (здесь я пренебрег проверкой типов и документацией):
Подводя итоги ожидаемых результатов для этих функций (при условии, что входные данные являются числами с плавающей запятой):
В списке это не проблема, вы всегда можете включить туда NaN (или Infinity):
Однако, если вы хотите включить его в
array
(например,array.array
илиnumpy.array
), тогда тип массива должен бытьfloat
илиcomplex
потому что в противном случае он попытается уменьшить его до типа массива!источник
math.isnan
не работает с комплексными числами. Используйтеmath.isnan(x.real) or math.isnan(x.imag)
вместо этого.При использовании Python 2.4, попробуйте
Я столкнулся с проблемой, когда я портировал simplejson на встроенное устройство, на котором работал Python 2.4,
float("9e999")
исправил его. Не используйтеinf = 9e999
, вам нужно преобразовать его из строки.-inf
дает-Infinity
.источник