使用 NumPy 计算非缺失值均值以填充矩阵中的 NaN

沈亦白
沈亦白
发布时间:2026-10-12 | 3人浏览过
原创

在数据处理中,直接将 NaN 替换为 0 往往是不合理的策略,特别是对于如开氏温度等物理量。本文介绍如何利用 NumPy 的矩阵操作,按列计算非 NaN 值的均值,并以此填充矩阵中的缺失值,从而更科学地处理数据缺失问题。

为什么避免将 NaN 直接置零

在处理矩阵数据时,一种常见的错误做法是将缺失值(NaN)直接替换为 0。这种做法通常被视为下策,原因如下:

  • 语义错误:当数值的实际意义未知时,置零可能引入严重的偏差。
  • 物理逻辑冲突:例如在涉及开氏温度(Kelvin)的计算中,0 代表绝对零度,这与“缺失数据”的概念完全不同,直接置零会破坏物理逻辑。

因此,采用基于现有数据的统计量(如均值)来填充缺失值,是更为稳健的处理方式。

基于非 NaN 值的均值填充策略

核心思路是:针对矩阵的每一列,仅利用该列中非 NaN 的值计算均值,然后用该均值替换该列中的所有 NaN 值。

具体操作步骤

  1. 初始化矩阵:创建一个包含 NaN 值的 NumPy 矩阵。
  2. 遍历列:获取矩阵的列数,并逐列处理。
  3. 计算非 NaN 均值:利用 isnan 和 nonzero 函数定位非 NaN 元素,计算其均值。
  4. 执行填充:定位 NaN 元素的位置,并将计算出的均值赋值给这些位置。

代码实现

以下是使用 NumPy 实现上述逻辑的完整代码示例:

from numpy import *# 定义包含 NaN 的矩阵datMat = mat([[1,2,3],[4,Nan,6]])# 获取矩阵的列数numFeat = shape(datMat)[1]# 遍历每一列for i in range(numFeat):  # 1. 找出当前列中非 NaN 值的索引  # isnan(datMat[:,i].A) 判断是否为 NaN  # ~isnan(...) 取反,即非 NaN 为 True  # nonzero(...) 获取非 NaN 值的行索引  non_nan_indices = nonzero(~isnan(datMat[:,i].A))[0]  
  # 2. 计算非 NaN 值的均值  meanVal = mean(datMat[non_nan_indices, i]) 
  
  # 3. 找出当前列中 NaN 值的行索引  nan_indices = nonzero(isnan(datMat[:,i].A))[0]  
  
  # 4. 将 NaN 值替换为计算出的均值  datMat[nan_indices, i] = meanVal 
  # 完成该列的 NaN 填充

代码逻辑解析

该实现主要依赖 NumPy 的布尔索引和矩阵切片功能:

  • datMat[:,i].A:将矩阵的第 i 列转换为数组,以便进行元素级操作。
  • isnan(datMat[:,i].A):生成一个布尔数组,标记 NaN 位置。
  • ~isnan(...):取反操作,标记非 NaN 位置。
  • nonzero(...):返回非零元素(即 True 值)的索引元组。对于一维切片,我们取第一个元素 [0] 获取行索引。
  • mean(datMat[non_nan_indices, i]):利用行索引切片获取非 NaN 的具体数值,并计算其平均值。
  • datMat[nan_indices, i] = meanVal:利用行索引将 NaN 位置的值更新为均值。

通过这种方式,我们避免了简单置零带来的数据失真,同时利用了矩阵中已有的有效信息来填补空缺,适用于大多数数值型数据的预处理场景。

以上就是使用 NumPy 按列均值填充矩阵中 NaN 的详细内容,更多关于 NumPy 数据清洗与矩阵处理的技术资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表