2019年1月23日星期三

Python 一组缺失值(NaN)的和为0 还是 NaN?积为1还是NaN?

这是一个很可能会踩的坑!

在Python,MATLAB 等编程语言里缺失值通常用 NaN 来表示,NaN 是 Not a Number 的缩写。

维基百科对 NaN 的解释

假如有三个数,分别是 10、20 和 NaN,对它们求和,忽略 NaN 的求和(例如 Python 里的 numpy.nansum),那么毫无意外地,得到的值为 10 + 20 = 30



假如三个数全是 NaN,那么求和结果是?我们可能预期得到 NaN,但实际上,程序计算结果为0!



关于计算结果应当为 0 还是 NaN,网上有一些讨论,具体可参见上图中的链接,这里不详细展开。



我个人更倾向于返回值为 NaN。因为返回结果是 0 的话,我并不知道到底是原来有值,例如1、0、-1,然后加总等于0,还是因为三个数全是 NaN 导致计算结果为 0


另外,除了和为0,一组 NaN 的乘以等于 1,而非 NaN,这点也需要注意。


IPv6 的 fe80开头的地址

fe80开头的 ipv6 地址不是公网地址,没人给你分ip,自动协商的地址,通常无法用于上网。 现在各大运营商用的ipv6: 电信是240e开头的(240e::/20) 移动是2409开头的(2409:8000::/20) 联通是2408开头的(2408:8000::/20)