NumPy 1.16低版本nan_to_num()传参报错的替代代码方案
NumPy 1.16版本兼容替换nan_to_num参数的方案
问题复现
在搭载Anaconda3 2019.03的高性能计算集群运行如下代码时触发报错:
array = np.nan_to_num( array, copy = False, # Replace nan = 0.0, posinf = 0.0, neginf = 0.0 )
报错信息如下:
Module for Anaconda3 2019.03 loaded. Run script ... Traceback (most recent call last): File "test.py", line 118, in <module> neginf = 0.0 TypeError: nan_to_num() got an unexpected keyword argument 'nan' Done
报错原因
nan、posinf、neginf三个自定义替换值的关键字参数是NumPy 1.17版本才新增的特性,当前集群环境为NumPy v1.16.2、Python v3.7.3,版本不支持该传参方式。
注意:NumPy 1.16版本自带的np.nan_to_num()默认将正无穷替换为数组dtype对应的最大有限值、负无穷替换为最小有限值,和原代码将三类异常值统一替换为0.0的逻辑不匹配,不能直接无参调用。
替换代码(和原逻辑完全一致)
以下代码和原代码copy=False的原地修改逻辑完全匹配,无额外数组副本内存开销,完全兼容NumPy 1.16版本:
# 一次性筛选所有非有限值(NaN、正无穷、负无穷),原地替换为0.0 array[~np.isfinite(array)] = 0.0
实现原理:np.isfinite()对有限数值返回True,对NaN、正无穷、负无穷三类异常值均返回False,取反后即可精准定位所有需要替换的元素。
如果需要对三类异常值分别设置不同替换值,可以使用分步判断的写法:
# 可分别为三类异常值指定不同替换值 array[np.isnan(array)] = 0.0 array[np.isposinf(array)] = 0.0 array[np.isneginf(array)] = 0.0
如果需要保留原数组、返回修改后的副本(对应原代码copy=True的逻辑),先对原数组做副本再执行上述替换即可:
array_copy = array.copy() array_copy[~np.isfinite(array_copy)] = 0.0
内容的提问来源于stack exchange,提问作者Stücke
相关产品推荐
相关产品推荐

