Чи можна встановити число на NaN або нескінченність?
Так, насправді існує кілька способів. Деякі працюють без будь-якого імпорту, тоді як інші вимагають import
, однак для цієї відповіді я обмежу бібліотеки в огляді стандартними бібліотеками та NumPy (що не стандартна бібліотека, а дуже поширена стороння бібліотека).
Наступна таблиця підсумовує способи, як можна створити не-число чи позитивну чи негативну нескінченність float
:
╒══════════╤══════════════╤════════════════════╤════════════════════╕
│ result │ NaN │ Infinity │ -Infinity │
│ module │ │ │ │
╞══════════╪══════════════╪════════════════════╪════════════════════╡
│ 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
константи повертають простий Python float
об'єкти.
numpy.NINF
Фактично єдина константа , я знаю , що не вимагає -
.
Можна створити складні NaN та Infinity за допомогою complex
та cmath
:
╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
│ result │ NaN+0j │ 0+NaNj │ Inf+0j │ 0+Infj │
│ module │ │ │ │ │
╞══════════╪════════════════╪═════════════════╪═════════════════════╪══════════════════════╡
│ built-in │ complex("nan") │ complex("nanj") │ complex("inf") │ complex("infj") │
│ │ │ │ complex("infinity") │ complex("infinityj") │
├──────────┼────────────────┼─────────────────┼─────────────────────┼──────────────────────┤
│ cmath │ cmath.nan ¹ │ cmath.nanj │ cmath.inf ¹ │ cmath.infj │
╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
Варіанти з ¹ повернути звичайну float
, а не a complex
.
чи є якась функція, щоб перевірити, чи є число нескінченним чи ні?
Так, є - насправді є кілька функцій для NaN, Infinity, і ні Nan, ні Inf. Однак ці заздалегідь задані функції не є вбудованими, вони завжди потребують import
:
╒══════════╤═════════════╤════════════════╤════════════════════╕
│ for │ NaN │ Infinity or │ not NaN and │
│ │ │ -Infinity │ not Infinity and │
│ module │ │ │ 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 або нескінченність.
- Ці
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):
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