为何np.sum([-np.Inf, +np.Inf])会触发无效值reduce警告?
NumPy 求和正负无穷时的警告问题
触发警告的场景
执行命令:
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
疑问点
- 执行以下两个命令均无警告,说明警告并非由 Inf 本身导致:
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]))" - 执行以下命令也无警告,说明警告并非由 NaN 结果导致:
python -c "import numpy as np; print(np.sum([np.nan, np.nan]))"
警告触发原因
正无穷加负无穷属于 IEEE 754 标准定义的无效运算(invalid operation),NumPy 在检测到这类运算时会抛出 RuntimeWarning。而两个同号无穷相加结果仍是同号无穷,属于合法运算;两个 NaN 相加结果为 NaN,但这类运算不属于「无效运算」范畴,因此都不会触发警告。
保留 NaN 结果的同时消除警告的方法
有两种实用方式:
- 临时抑制特定警告:使用 NumPy 的
errstate上下文管理器,仅屏蔽无效运算类警告,不影响其他类型的警告提示:
python -c "import numpy as np; with np.errstate(invalid='ignore'): print(np.sum([-np.Inf, +np.Inf]))"
- 全局调整警告设置:如果需要长期屏蔽这类警告,可以全局修改 NumPy 的错误处理配置:
python -c "import numpy as np; np.seterr(invalid='ignore'); print(np.sum([-np.Inf, +np.Inf]))"
注意:第二种方式会全局屏蔽所有「无效运算」类型的警告,使用前需确认不会遗漏其他需要关注的异常场景。
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

