用布尔索引替换 inf 最稳妥:arr[np.isinf(arr)] = 0,因 np.isinf 同时捕获正负无穷,而 arr == np.inf 会漏掉 -np.inf;若数组只读需先 copy;np.nan_to_num 默认不替换成 0 且性能较低。

直接用 numpy.where 或布尔索引赋值,比循环快几十倍,且能一步到位处理 np.inf 和 -np.inf。
怎么用布尔索引把 inf 替换成 0(或任意数)
NumPy 数组支持直接用 np.isinf() 生成布尔掩码,再对满足条件的位置批量赋值——这是最常用也最稳妥的方式。
-
np.isinf(arr)同时捕获np.inf和-np.inf,返回同形状的bool数组 - 别用
arr == np.inf:它对-np.inf返回False,漏掉负无穷 - 赋值语句写成
arr[np.isinf(arr)] = 0,不是arr[np.isinf(arr)] = [0](后者可能报错或广播异常) - 如果原数组是只读的(比如来自 HDF5 或某些视图),先检查
arr.flags.writeable,必要时用arr.copy()
import numpy as np arr = np.array([1.0, np.inf, -np.inf, 2.5]) arr[np.isinf(arr)] = 0 # → [1. 0. 0. 2.5]
为什么不用 np.nan_to_num?它和 isinf 赋值有啥区别
np.nan_to_num 确实能处理 inf,但它默认行为更“激进”:不仅替换 inf,还会把 nan 换成 0,并把极小浮点数(如次正规数)替换成 0 或 ±tiny。如果你只要动 inf,它反而引入干扰。
- 默认参数下:
np.nan_to_num(arr)把np.inf → np.finfo(arr.dtype).max,不是你想要的 0 - 想让它替换成 0,得显式写:
np.nan_to_num(arr, nan=0, posinf=0, neginf=0) - 性能略低于纯布尔索引:它内部做了类型检查、nan 判断、极值判断三重逻辑
- 适合场景:你本就要一并清理
nan和inf,且接受默认极值替换规则
在 pandas DataFrame 里批量处理 inf(尤其含混合类型列)
pandas 的 df.replace 对 inf 支持不稳定,df.applymap 已弃用,正确做法是针对数值列用 select_dtypes + 布尔索引。
立即学习“Python免费学习笔记(深入)”;
- 别写
df.replace([np.inf, -np.inf], 0):在 object 列里会失败,且不生效于 float 列的底层数据 - 推荐写法:
num_cols = df.select_dtypes(include='number').columns; df[num_cols] = df[num_cols].where(~np.isinf(df[num_cols]), 0) -
where比直接赋值更安全:它保留原 dtype,不会因插入 int 0 导致 float 列升格为 object - 如果某列是
category或string类型,跳过处理——isinf在非数值类型上会报TypeError
真正容易被忽略的是:np.isinf 对整数数组返回全 False(因为 Python 整数没有 inf 表示),所以如果你的数据混了 int 和 float 类型,得先统一转成 float,或者加类型判断。否则看着没报错,inf 就悄悄漏掉了。


















