如何在NumPy中将异常值替换为NaN并保持数组长度?
解决方案:将异常值替换为NaN以保持数组长度
原函数通过过滤删除异常值,导致返回的数组长度缩短,无法和原时间轴x匹配绘图。我们可以修改函数,把异常值替换为np.nan,这样既剔除了伪影数据,又能保持数组原有长度,完美适配时间轴。
修改后的异常值处理函数
def replace_outliers_with_nan(y, n=2): # y为输入的一维numpy数组 mean = np.mean(y) sd = np.std(y) # 生成掩码:标记所有超出均值±n倍标准差的异常值 outlier_mask = (y < mean - n * sd) | (y > mean + n * sd) # 复制原数组,避免修改原始数据 cleaned_data = y.copy() # 将异常值替换为NaN cleaned_data[outlier_mask] = np.nan return cleaned_data
函数说明
- 计算数组的均值和标准差,用
n控制异常值的判定阈值(默认2倍标准差) - 创建布尔掩码识别异常位置
- 复制原数组后替换异常值为NaN,保留原数组长度
- 返回的清洗后数组和原数组长度完全一致,可直接和时间轴
x配对绘图
完整使用代码
import numpy as np import plotly.express as px # 从CDAweb获取数据 from ai import cdas import datetime # 导入数据 start = datetime.datetime(2016, 1, 24, 0, 0, 0) end = datetime.datetime(2016, 1, 25, 0, 0, 0) data = cdas.get_data( 'sp_phys', 'THG_L2_MAG_'+ 'PG2', start, end, ['thg_mag_'+ 'pg2'] ) x = data['UT'] y = data['VERTICAL_DOWN_-_Z'] def replace_outliers_with_nan(y, n=2): mean = np.mean(y) sd = np.std(y) outlier_mask = (y < mean - n * sd) | (y > mean + n * sd) cleaned_data = y.copy() cleaned_data[outlier_mask] = np.nan return cleaned_data # 生成清洗后的数据 y_clean = replace_outliers_with_nan(y) # 验证长度一致性 print('原始数据长度:', len(y)) print('清洗后数据长度:', len(y_clean)) # 输出应与原始长度相同 # 绘制折线图,x和y_clean长度匹配,可正常显示 px.line(x=x, y=y_clean, title='替换异常值为NaN后的磁力计数据')
扩展:用邻域值填充NaN(可选)
如果不想保留NaN,想用相邻有效值的插值填充,可以借助pandas实现:
import pandas as pd # 用线性插值填充NaN值 y_filled = pd.Series(y_clean).interpolate(method='linear').values # 绘制填充后的折线图 px.line(x=x, y=y_filled, title='插值填充异常值后的磁力计数据')
内容的提问来源于stack exchange,提问作者Iotatron
相关产品推荐
相关产品推荐

