Можно ли установить число в NaN или бесконечность?
146 Bob [2011-03-26 01:24:00]
Можно ли установить элемент массива в NaN в Python?
Кроме того, можно ли установить переменную в +/- бесконечность? Если да, существует ли какая-либо функция для проверки того, является ли число бесконечным или нет?
python numeric nan infinite
4 ответа
197 Решение marcog [2011-03-26 01:25:00]
Листинг из строки с помощью float():
>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False
60 Olivier Verdier [2011-03-26 03:19:00]
Да, вы можете использовать numpy для этого.
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
11 MSeifert [2017-02-01 04:16:00]
Можно ли установить число в NaN или бесконечность?
Да, на самом деле есть несколько способов. Некоторые из них работают без какого-либо импорта, в то время как другие требуют import, однако для этого ответа я ограничу библиотеки в обзоре стандартной библиотекой и NumPy (который не является стандартной библиотекой, а очень распространенной сторонней библиотекой).
В следующей таблице приведены способы, как можно создать не-а-номер или положительный или отрицательный пейзажный float:
╒══════════╤══════════════╤════════════════════╤════════════════════╕
│ module │ NaN │ Infinity │ -Infinity │
╞══════════╪══════════════╪════════════════════╪════════════════════╡
│ built-in │ float("nan") │ float("inf") │ -float("inf") │
│ │ │ float("infinity") │ -float("infinity") │
│ │ │ float("+inf") │ float("-inf") │
│ │ │ float("+infinity") │ float("-infinity") │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ math │ math.nan │ math.inf │ -math.inf │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ cmath │ cmath.nan │ cmath.inf │ -cmath.inf │
├──────────┼──────────────┼────────────────────┼────────────────────┤
│ numpy │ numpy.nan │ numpy.PINF │ numpy.NINF │
│ │ numpy.NaN │ numpy.inf │ -numpy.inf │
│ │ numpy.NAN │ numpy.infty │ -numpy.infty │
│ │ │ numpy.Inf │ -numpy.Inf │
│ │ │ numpy.Infinity │ -numpy.Infinity │
╘══════════╧══════════════╧════════════════════╧════════════════════╛
Пара замечаний к столу:
- Конструктор
floatфактически нечувствителен к регистру, поэтому вы также можете использоватьfloat("NaN")илиfloat("InFiNiTy"). - Константы
cmathиnumpyвозвращают простые объекты сfloatPython. -
numpy.NINF- фактически единственная известная мне константа, для которой не требуется-. -
Можно создать комплекс NaN и Infinity с
complexиcmath:╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕ │ module │ NaN+0j │ 0+NaNj │ Inf+0j │ 0+Infj │ ╞══════════╪════════════════╪═════════════════╪═════════════════════╪══════════════════════╡ │ built-in │ complex("nan") │ complex("nanj") │ complex("inf") │ complex("infj") │ │ │ │ │ complex("infinity") │ complex("infinityj") │ ├──────────┼────────────────┼─────────────────┼─────────────────────┼──────────────────────┤ │ cmath │ cmath.nan │ cmath.nanj │ cmath.inf │ cmath.infj │ ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
Есть ли функция, чтобы проверить, является ли число бесконечностью или нет?
Да, есть - на самом деле есть несколько функций для NaN, Infinity и ни Nan, ни Inf. Однако эти предопределенные функции не являются встроенными, они всегда требуют import:
╒══════════╤═════════════╤════════════════╤════════════════════╕
│ module │ NaN │ Infinity or │ not NaN and │
│ │ │ -Infinity │ not Infinity and │
│ │ │ │ not -Infinity │
╞══════════╪═════════════╪════════════════╪════════════════════╡
│ math │ math.isnan │ math.isinf │ math.isfinite │
├──────────┼─────────────┼────────────────┼────────────────────┤
│ cmath │ cmath.isnan │ cmath.isinf │ cmath.isfinite │
├──────────┼─────────────┼────────────────┼────────────────────┤
│ numpy │ numpy.isnan │ numpy.isinf │ numpy.isfinite │
╘══════════╧═════════════╧════════════════╧════════════════════╛
Опять пара замечаний:
- Функции
cmathиnumpyтакже работают для сложных объектов, они проверят, является ли действительная или мнимая часть NaN или Infinity. -
numpyфункции также работают дляnumpyмассивов и всего, что может быть преобразовано в один (например, списки, кортежи и т.д.) - Есть также функции, которые явно проверяют положительную и отрицательную бесконечность в NumPy:
numpy.isposinfиnumpy.isneginf. - Pandas предлагает две дополнительные функции для проверки на
NaN(но не только 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): return not (isnan(value) or isinf(value))
Подводя итоги ожидаемых результатов для этих функций (при условии, что ввод является плавающим):
╒════════════════╤═══════╤════════════╤═════════════╤══════════════════╕
│ input │ NaN │ Infinity │ -Infinity │ something else │
│ function │ │ │ │ │
╞════════════════╪═══════╪════════════╪═════════════╪══════════════════╡
│ isnan │ True │ False │ False │ False │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isinf │ False │ True │ True │ False │
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
│ isfinite │ False │ False │ False │ True │
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛
Можно ли установить элемент массива в NaN в Python?
В списке это не проблема, вы всегда можете включить туда NaN (или Infinity):
>>> [math.nan, math.inf, -math.inf, 1] # python list
[nan, inf, -inf, 1]
Однако, если вы хотите включить его в array (например, array.array или numpy.array), тогда тип массива должен быть float или complex потому что в противном случае он попытается уменьшить его до типа массива!
>>> import numpy as np
>>> float_numpy_array = np.array([0., 0., 0.], dtype=float)
>>> float_numpy_array[0] = float("nan")
>>> float_numpy_array
array([nan, 0., 0.])
>>> import array
>>> float_array = array.array('d', [0, 0, 0])
>>> float_array[0] = float("nan")
>>> float_array
array('d', [nan, 0.0, 0.0])
>>> integer_numpy_array = np.array([0, 0, 0], dtype=int)
>>> integer_numpy_array[0] = float("nan")
ValueError: cannot convert float NaN to integer
При использовании Python 2.4 попробуйте
inf = float("9e999")
nan = inf - inf
Я столкнулся с проблемой, когда я портировал simplejson на встроенное устройство, которое запускало Python 2.4, float("9e999") исправил его. Не используйте inf = 9e999, вам нужно преобразовать его из строки.
-inf дает -Infinity.