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

如何在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

函数说明

  1. 计算数组的均值和标准差,用n控制异常值的判定阈值(默认2倍标准差)
  2. 创建布尔掩码识别异常位置
  3. 复制原数组后替换异常值为NaN,保留原数组长度
  4. 返回的清洗后数组和原数组长度完全一致,可直接和时间轴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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:05:24