[英]Why does `np.sum([-np.Inf, +np.Inf])` warn about "invalid value encountered in reduce"
python -c "import numpy as np; print(np.sum([-np.Inf, +np.Inf]))"
给
numpy\core\fromnumeric.py:86: RuntimeWarning: invalid value encountered in reduce
return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
nan
我不知道这是为什么:
里面没有警告
python -c "import numpy as np; print(np.sum([-np.Inf, -np.Inf]))"
也不在
python -c "import numpy as np; print(np.sum([+np.Inf, +np.Inf]))"
所以它不可能是Inf
s。
里面没有警告
python -c "import numpy as np; print(np.sum([np.nan, np.nan]))"
所以它不可能是NaN
结果。
那么,它是什么,我该如何避免呢? 我实际上喜欢得到NaN
结果,我只是想避免警告。
警告很好,因为Inf - Inf
在数学上未定义。 你期望什么结果?
如果您想避免警告,请使用如下过滤器:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore", category=RuntimeWarning)
res = np.sum([-np.Inf, np.Inf])
事实证明,@CarlosHorn 的答案非常接近,尽管隐藏在 IEEE 标准 754 的深处(我检查了 2008 版本)。
第 7.2 节(默认异常处理 > 无效操作)写道
当且仅当没有有用的可定义结果时,才会发出无效操作异常信号。
考虑到有些人可能觉得Inf
没有用,我不知道什么是“有用的可定义结果”; 相比之下,我发现甚至NaN
也很有用。 不管怎样,本节给出了一个完整的示例列表,其中包括(在 d 中)“无穷大的减法”,解释了 Inf 的原因和形式Inf - Inf
应被视为无效。 它还包括(在 a 中)“对信号 NaN 的任何 [...] 操作”,但不包括对安静 NaN 的操作。 这个重要的区别解释了为什么NaN + NaN
通常不发出信号,因为np.nan
是安静的。
为了完整起见,第 6.1 节解释了为什么Inf + Inf
不应被视为无效。
还有两件事要说:
np.inf - np.inf
不会引发异常。with np.errstate(invalid="ignore"): ...
可能是抑制警告的最干净的方法。更多资源:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.