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

Scipy中如何实现忽略零值数据点的median_filter中值滤波

可行实现方案

scipy 自带的 median_filter 没有内置过滤指定数值的逻辑,你可以通过 generic_filter 自定义滤波规则实现需求,以下是两种可直接使用的实现:

方案1:基础自定义实现

适合小数据量场景,逻辑可控,可自定义特殊场景的处理规则:

import numpy as np
from scipy.ndimage import generic_filter

def non_pos_ignored_median_filter(input_arr, window_size):
    def calc_median(window):
        # 过滤窗口内所有非正数值
        valid_values = window[window > 0]
        # 可根据需求调整无有效值时的返回值,示例默认返回0
        if valid_values.size == 0:
            return 0
        return np.median(valid_values)
    return generic_filter(input_arr, calc_median, size=window_size)

效果测试

针对你给出的示例场景测试:

test_data = np.array([40, 50, 0, 90])
# 窗口大小设置为4,和示例窗口匹配
result = non_pos_ignored_median_filter(test_data, window_size=4)
# 输出结果中对应位置的中位数为50,符合预期

方案2:高性能优化实现

处理大尺寸数组(比如高清图像)时,优先选择该方案,利用numpy内置的NaN处理逻辑提升运算效率:

import numpy as np
from scipy.ndimage import generic_filter

def fast_non_pos_ignored_median_filter(input_arr, window_size):
    # 先将所有非正数值替换为NaN
    masked_arr = np.where(input_arr > 0, input_arr, np.nan)
    # nanmedian会自动忽略NaN值计算中位数
    result = generic_filter(masked_arr, np.nanmedian, size=window_size)
    # 可自行添加后续NaN处理逻辑,比如替换为0、原数组值等
    return np.nan_to_num(result, nan=0)

注意事项

  • 两种方案都支持一维、二维、多维数组,window_size 参数用法和原生 median_filter 完全一致,支持传入 tuple 指定不同维度的窗口大小
  • 无有效值场景的返回值可根据业务需求调整,比如需要保留原位置数值的话,可传入原数组做替换即可

内容的提问来源于stack exchange,提问作者Harry Chittenden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:24:09