You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:57:22