3.4-特殊数值处理.md

3.4 特殊数值处理

3.4 特殊数值处理

特殊数值是指在特定计算过程中可能出现的特殊值,通常在数学运算中产生,用来表示无法被常规数值定义的结果。NaN表示无效或未定义的数值,例如0除以0或对负数取平方根时可能出现。Inf表示正无穷或负无穷:正无穷(+inf)通常由正数除以零产生,负无穷(-inf)由负数除以零产生;除以零或超过计算机所能表示的数值范围时也会出现Inf。数组一旦混入特殊数值,若不加处理就会传播到计算结果中。例如b = np.array([1, -1, 0])时,b / 0得到array([ inf, -inf, nan]);对a = np.array([1, 2, np.nan, 4])执行np.sum(a),结果为nan。含NaN或Inf的数组数据类型会变为浮点型(如float64)。

NumPy提供检测与处理函数,用于数据清洗或数值稳定性分析。np.isnan()逐个判断元素是否为NaN;np.isinf()逐个判断是否为无穷大。对a = np.array([1, 2, np.nan, np.inf, -np.inf]),isnan得到[False, False, True, False, False],isinf得到[False, False, False, True, True](正无穷与负无穷均为True)。四种常用处理:(1)过滤特殊值:使用布尔索引valid_arr = arr[~(np.isnan(arr) | np.isinf(arr))],其中~为逻辑反运算、|为逻辑或运算,只保留有效数值;(2)替换为特定值:np.nan_to_num(arr, nan=0, posinf=1e10, neginf=-1e10)将NaN替换为0、正无穷替换为一个很大的数、负无穷替换为一个很小的数;(3)替换为统计值:先mean_value = np.nanmean(arr),再arr[np.isnan(arr)] = mean_value;(4)计算时忽略特殊值:np.nansum()、np.nanmean()在求和、求均值时会忽略NaN。例如arr = np.array([1, np.nan, 3, 4, 5])时,np.nansum(arr)为13.0,np.nanmean(arr)为3.25。

易错点:不能用等于比较判断NaN(NaN不等于任何值,包括自身),必须用isnan;普通np.sum遇到NaN会把nan传播到整个结果,不要误当作已跳过缺失值;isinf同时识别正负无穷,过滤时需把isnan与isinf一并排除;nan_to_num的posinf、neginf应按分析需要指定,否则替换后的有限数未必符合题意。

关键要点

下载此文件