平滑lis中的攻击性值

2024-03-28 18:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我认为这是一个新问题,我们没有解决办法。我需要对一个数字列表中的一个非常大的值实施某种扼杀。例如

list = np.array([3, 3, 3, 15, 3, 3, 3])

我做了非常简单的实现,扼杀了这样的价值观。我已经试过了。你知道吗

def smooth(x, window, threshold):
    for idx, val in enumerate(x):
        if idx < window:
            continue
        avr = np.mean(
            x[idx-window:idx])

        if abs(avr - val) > threshold:
            x[idx] = avr + threshold

print(smooth(list1, 3, 1))
# [3, 3, 3, 4, 3, 3, 3]

在这种情况下,一切正常,但举另一个例子,我需要以另一种方式平滑数据(高斯平滑为ex)。你知道吗

list = np.array([3, 3, 3, 15, 15, 15])
print(smooth(list, 3, 1))
# [3, 3, 3, 4, 4, 3]

因为window从左向右移动,我不知道下一个值的norm。当然,我可以从两个方向评估这个数字的窗口,但只是想知道正确的方法,或常见的技术。你知道吗


Tags: 列表thresholdifnp数字valwindowarray
1条回答
网友
1楼 · 发布于 2024-03-28 18:25:12

我建议不要自己实现1D过滤,因为

  • 当采用简单的方法时,很可能会将工件引入数据中(就像在代码段中使用矩形过滤器形状一样)。你知道吗
  • 您不太可能像已经优化了几十年的现有实现那样快速地远程实现
  • 除非你是出于自我教育的原因,否则这是一个通过重新发明轮子来浪费时间的典型例子

取而代之的是利用丰富多样的现有实现,例如在scipy包中。您可以在这里找到一个很好的示例:Smoothing of a 1D signal (Scipy Cookbook)

相关问题 更多 >