是否可以NaN
在Python中将数组的元素设置为?
另外,是否可以将变量设置为+/-无穷大?如果是这样,是否有任何功能可以检查数字是否为无穷大?
isinf
和isnan
提供的适当功能numpy
。请参阅下面的答案。
是否可以NaN
在Python中将数组的元素设置为?
另外,是否可以将变量设置为+/-无穷大?如果是这样,是否有任何功能可以检查数字是否为无穷大?
isinf
和isnan
提供的适当功能numpy
。请参阅下面的答案。
Answers:
使用float()
以下内容从字符串进行转换:
>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False
是的,您可以使用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
math.isnan()
andmath.isinf()
numpy
如果您想要的是NaN
或者inf
NaN
或Inf
,那么from numpy import nan, inf
自提出这个问题以来一直存在。
是否可以将数字设置为NaN或无穷大?
是的,实际上有几种方法。一些工作没有任何导入,而另一些工作则需要import
,但是对于此答案,我将概述中的库限制为standard-library和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
其实是我知道的,不需要的唯一不变的-
。可以使用complex
和创建复杂的NaN和Infinitycmath
:
╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
│ 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
,而不是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.isposinf
和中显式检查正负无穷大numpy.isneginf
。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 │
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛
可以在Python中将数组的元素设置为NaN吗?
在列表中没问题,您可以始终在其中添加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
math.isnan
不适用于复数。使用math.isnan(x.real) or math.isnan(x.imag)
代替。
使用Python 2.4时,请尝试
inf = float("9e999")
nan = inf - inf
当我将simplejson移植到运行Python 2.4的嵌入式设备时,遇到了问题float("9e999")
。不要使用inf = 9e999
,您需要将其从字符串转换为。
-inf
给出-Infinity
。