平滑列表中的进取值

时间:2019-01-13 12:02:07

标签: python algorithm numpy collections

我认为这是一个新问题,我们没有解决方案。我需要对数字列表中的非常大的值实施某种抑制措施。对于前。

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]

在这种情况下,一切正常,但是再举一个例子,我需要以另一种方式平滑数据(例如高斯平滑)。

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

由于window从左到右移动,我不知道下一个值的norm。当然,我可以从两个方向评估此数字的窗口,但只是想知道正确的方法或常用技术。

1 个答案:

答案 0 :(得分:2)

我建议不要自己实施一维过滤,因为

  • 如果采用幼稚的方法(例如,像在代码片段中那样使用矩形过滤器形状),很可能会将伪像引入数据中。
  • 您不太可能想像已经实现了数十年优化的现有实现那样以远程方式实现实现
  • 除非出于自动指导的原因这样做,否则这是通过重新发明轮子浪费时间的经典示例

而是利用各种现有的实现方式,例如在scipy包中。您可以在这里找到一个很好说明的用法示例:Smoothing of a 1D signal (Scipy Cookbook)