【问题标题】:Weighted smoothing of a 1D array - Python一维数组的加权平滑 - Python
【发布时间】:2016-02-06 19:01:27
【问题描述】:

我对 Python 很陌生,我有一些参数检测数组,其中一些值被错误地检测到(例如 4555555):

array = [1, 20, 55, 33, 4555555, 1]

我想以某种方式平滑它。现在我正在使用加权平均数:

def smoothify(array):
    for i in range(1, len(array) - 2):
        array[i] = 0.7 * array[i] + 0.15 * (array[i - 1] + array[i + 1])
    return array

但它的效果很差,当然,我们可以取超过 3 个元素的加权平均值,但它会导致复制粘贴...我试图为此找到一些本机函数,但我失败了。

你能帮我解决这个问题吗?

附:对不起,如果这是一个菜鸟问题:(

感谢您的宝贵时间, 最好的问候,安娜

【问题讨论】:

    标签: python numpy smoothing


    【解决方案1】:

    出于加权平滑的目的,您基本上希望执行convolution。对于我们的例子,由于我们处理的是一维数组,我们可以简单地使用 NumPy 的一维卷积函数:np.convolve 来获得矢量化解决方案。这里要记住的唯一重要的事情是,考虑到卷积的性质,权重将被反转,该卷积使用在主输入数组中滑动的反转版本的内核。因此,解决方案是 -

    weights = [0.7,0.15,0.15]
    out = np.convolve(array,np.array(weights)[::-1],'same')
    

    如果您希望获得加权平均值,您可以使用out/sum(weights) 获得那些。在我们的例子中,由于给定权重的总和已经是 1,所以输出将保持与 out 相同。

    让我们绘制输出和输入以进行图形调试 -

    # Input array and weights
    array = [1, 20, 55, 33, 455, 200, 100, 20 ]
    weights = [0.7,0.15,0.15]
    
    out = np.convolve(array,np.array(weights)[::-1],'same')
    
    x = np.arange(len(array))
    f, axarr = plt.subplots(2, sharex=True, sharey=True)
    axarr[0].plot(x,array)
    axarr[0].set_title('Original and smoothened arrays')
    axarr[1].plot(x,out)
    

    输出 -

    【讨论】:

      【解决方案2】:

      建议numpy.average 帮助您解决此问题。诀窍是计算权重 - 下面我压缩了三个列表 - 一个与原始数组相同,下一步向前,下一步落后。获得权重后,我们将它们输入np.average 函数

      import numpy as np
      array = [1, 20, 55, 33, 4555555, 1]
      arrayCompare = zip(array, array[1:] + [0], [0] + array)
      
      weights = [.7 * x + .15 * (y + z) for x, y, z in arrayCompare]
      
      avg = np.average(array, weights=weights)
      

      【讨论】:

        【解决方案3】:

        也许你想看看 numpy,尤其是numpy.average。 另外,你看到这个问题Weighted moving average in python了吗?也可能有帮助。

        【讨论】:

          【解决方案4】:

          既然你用 numpy 标记了这个,我写了我将如何用 numpy 做到这一点:

          import numpy as np
          
          def smoothify(thisarray):
              """
              returns moving average of input using:
              out(n) = .7*in(n) + 0.15*( in(n-1) + in(n+1) )
              """
          
              # make sure we got a numpy array, else make it one
              if type(thisarray) == type([]): thisarray = np.array(thisarray)
          
              # do the moving average by adding three slices of the original array
              # returns a numpy array,
              # could be modified to return whatever type we put in...
              return 0.7 * thisarray[1:-1] + 0.15 * ( thisarray[2:] + thisarray[:-2] )
          
          myarray = [1, 20, 55, 33, 4555555, 1]
          smootharray = smoothify(myarray)
          

          使用 numpy 可以通过索引获得“切片”,而不是循环遍历原始数组。输出数组将比输入数组短两个项目。中心点 (n) 是 thisarray[1:-1] :“从项目索引 1 到最后一个项目(不包括在内)”。其他切片是“从索引 2 到结尾”和“除最后两个之外的所有内容”

          【讨论】:

            猜你喜欢
            • 2015-11-16
            • 2018-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多