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
相关产品推荐
相关产品推荐

