Присваивая переменной значение NaN в Python и NumPy без



большинство языков имеют константу NaN, которую можно использовать для присвоения переменной значения NaN. Может ли python сделать это без использования numpy?

2046   6  

6 ответов:

Да -- использовать float('nan'). Как в Python 3.5, вы также можете использовать math.nan.

>>> a = float('nan')
>>> print(a)
nan
>>> print(a + 2)
nan
>>> a == a
False
>>> import math
>>> math.isnan(a)
True
>>> # Python 3.5+
>>> math.isnan(math.nan)
True

The float(...) функция нечувствительна к регистру -- doing float('NAN') или float('naN') или подобные вещи тоже будут работать.

обратите внимание, что проверка, чтобы увидеть, если две вещи, которые NaN равны друг другу всегда будет возвращать false. Отчасти это связано с тем, что две вещи, которые "не являются числом", не могут (строго говоря) быть равны друг другу-см. что обоснование для всех сравнений, возвращающих false для значений IEEE754 NaN? для получения более подробной информации.

вместо этого используйте math.isnan(...) если нужно определить, является ли значение NaN или нет.

кроме того, точная семантика == операция над значением NaN может вызвать тонкие проблемы при попытке сохранить NaN внутри типов контейнеров, таких как list или dict (или при использовании пользовательских типов контейнеров). Смотрите проверка на NaN наличие в контейнере для более подробной информации.


вы также можете построить числа NaN с помощью Python decimal модуль:

>>> from decimal import Decimal
>>> b = Decimal('nan')
>>> print(b)
NaN
>>> print(repr(b))
Decimal('NaN')
>>>
>>> Decimal(float('nan'))
Decimal('NaN')
>>> 
>>> import math
>>> math.isnan(b)
True

math.isnan(...) также будет работать с десятичными объектов.


, вы не может построить NaN числа в Питоне фракции модуль:
>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 146, in __new__
    numerator)
ValueError: Invalid literal for Fraction: 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 130, in __new__
    value = Fraction.from_float(numerator)
  File "C:\Python35\lib\fractions.py", line 214, in from_float
    raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
ValueError: Cannot convert nan to Fraction.

Кстати, Вы тоже можете сделать float('Inf'),Decimal('Inf') или math.inf (3.5+) для назначения бесконечных чисел. (А также см. math.isinf(...))

делаешь Fraction('Inf') или Fraction(float('inf')) не разрешается и будет выдавать исключение, так же, как Нан.

если вы хотите быстрый и простой способ проверить, если число не является ни NaN, ни бесконечным, вы можете использовать math.isfinite(...) начиная с Python 3.2+.


если вы хотите сделать подобные проверки с комплексными числами, то cmath модуль содержит аналогичный набор функций а константы как то math модуль:

nan = float('nan')

и теперь у вас есть постоянный, nan.

вы можете аналогичным образом создавать значения NaN для десятичных чисел.Десятичный.:

dnan = Decimal('nan')

использовать float("nan"):

>>> float("nan")
nan

можно сделать float('nan') чтобы получить НАН.

вы можете получить NaN от "inf-inf", и вы можете получить "inf" от числа больше, чем 2e308, поэтому я обычно использовал:

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan

более последовательный (и менее непрозрачный) способ генерации inf и-inf-это снова использовать float ():

>> positive_inf = float('inf')
>> positive_inf
inf
>> negative_inf = float('-inf')
>> negative_inf
-inf
import sys
sys.float_info
sys.float_info(max=1.7976931348623157e+308,
               max_exp=1024, max_10_exp=308,
               min=2.2250738585072014e-308, min_exp=-1021,
               min_10_exp=-307, dig=15, mant_dig=53,
               epsilon=2.220446049250313e-16, radix=2, rounds=1)

Comments

    Ничего не найдено.