升级Numpy至1.14.1后执行任意命令触发RuntimeWarning的问题咨询
解决Numpy 1.14.1升级后出现的RuntimeWarning: invalid value encountered in reduce问题
我之前升级Numpy到1.14.x版本时也碰到过一模一样的情况,明明只是输个1+1都弹警告,当时整懵了,后来折腾了一阵终于搞清楚原因和解决办法:
问题原因
这个警告不是你当前执行的简单计算触发的,而是你的Python环境里有其他代码(比如加载的第三方库、后台运行的脚本)在偷偷调用Numpy的reduce相关函数(像np.sum、np.mean这类底层依赖reduce的函数),并且处理了包含NaN或者inf的无效值数组。
Numpy 1.14.x版本对警告机制做了调整——之前版本里可能被静默忽略的无效值处理操作,现在会主动抛出警告。哪怕你当前操作看起来和它无关,只要后台有代码在运行时触发了这个逻辑,警告就会弹出来。
解决办法
1. 先定位触发警告的根源
想要彻底解决,得先找到到底是谁在搞事情。可以用Python的warnings模块把警告转换成错误,这样就能看到完整的调用栈:
import warnings # 把警告转为错误,方便查看调用栈 warnings.filterwarnings("error") # 执行你之前触发警告的操作,比如输入1+1 1+1
运行后会抛出完整的错误栈,里面会明确显示是哪个函数、哪个库触发了这个警告。
2. 根据根源针对性修复
- 如果是第三方库导致的:检查该库的版本是否和Numpy 1.14.1兼容。比如pandas在0.22.x之前的版本和Numpy 1.14.x有兼容问题,只要把对应的库升级到最新兼容版本就能解决。
- 如果是自己的代码导致的:找到使用
np.reduce或者依赖它的函数的地方,检查是否处理了包含NaN的数组。可以替换成np.nansum、np.nanmean这类专门处理NaN的函数;或者如果确实需要保留无效值,也可以在特定代码块里临时设置Numpy的错误处理:import numpy as np # 临时屏蔽无效值警告 old_settings = np.seterr(invalid='ignore') # 执行你的代码 # ... # 恢复原来的设置 np.seterr(**old_settings)
3. 临时应急方案(不推荐长期使用)
如果暂时没时间定位根源,可以在代码开头全局屏蔽这个警告,但这只是治标不治本:
import numpy as np # 全局屏蔽无效值相关警告 np.seterr(invalid='ignore')
内容的提问来源于stack exchange,提问作者Ethunxxx
相关产品推荐
相关产品推荐

