恼人的NaN (Not a Number)

简介

  NaN的全称是Not a Number,意思是“不是一个数字”,它用于代表那些未定义或是不可表征的值。比如在数值运算时遇到分母为0的情况,其结果往往会用NaN来代替。下面我主要针对Python中的NaN的性质进行探讨。

创建NaN

  虽然不是一个数,但NaN属于浮点数类型。

>>> import math
>>> import numpy as np
>>> math_nan = math.nan
>>> np_nan = np.nan
>>> float_nan = float('nan')
>>> isinstance(math_nan, float) and isinstance(np_nan, float) and isinstance(float_nan, float)
>>> True

  这里介绍了三种方法,其中前两种其实只是分别对两个库各自预先定义的NaN进行引用,第三种方法会创建新的NaN(开辟新的内存空间)。

>>> math_nan is math_nan and np_nan is np.nan
>>> True
>>> math_nan is np_nan or float_nan is float('nan')
>>> False

检测NaN

  由于NaN是未被定义的值,所以它无所谓大小或是相等。

>>> math_nan==math_nan or np_nan>np_nan or float_nan<float_nan
>>> False
>>> math_nan!=math_nan and np_nan!=np_nan and float_nan!=float_nan
>>> True

  所以要想用关系运算来检测NaN,需要通过自身不等于自身这一点来实现。当然用python库自带的检测会更好理解以及让人放心。

>>> math.isnan(math_nan) and math.isnan(np_nan) and math.isnan(float_nan)
>>> True
>>> np.isnan(math_nan) and np.isnan(np_nan) and np.isnan(float_nan)
>>> True

应对NaN

  NaN的存在有时会影响计算,除了一开始避免产生NaN,对于一些无法避免的,我们首先就是要能检测到它,然后根据我们的需求做出相应处理。比如在求平均的时候忽略NaN,或是把NaN转化成不影响后续步骤的值。

>>> np.mean([1, np_nan, 3])
>>> nan
>>> np.nanmean([1, np_nan, 3])
>>> 2.0
>>> np.nan_to_num(np_nan)
>>> 0.0

参考资料

  1. https://en.wikipedia.org/wiki/NaN
  2. https://riptutorial.com/python/example/3973/infinity-and-nan---not-a-number--
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,876评论 0 10
  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,846评论 0 27
  • 大家都在说,你在大学学到了什么? 不讲虚的,说点实在的吧,聊聊我的大学体育选修课。 一般的选修课,都是在电脑上进行...
    君好么阅读 618评论 2 1
  • 今日体验:今天早上一个老客户进店维修水温不上.水温用电脑读取一直是40度发动机一直处于1400转高怠速运转.起初报...
    fe20d692e40e阅读 125评论 0 0
  • Kruskal 加边式: 每次都加入 连接了两个联通子图的、当前可选择w最小的##边## 每次按照权重由小->大遍...
    Phoebe_Liu阅读 617评论 0 1