Moving average or running mean

后端 未结 27 1342
庸人自扰
庸人自扰 2020-11-22 08:37

Is there a SciPy function or NumPy function or module for Python that calculates the running mean of a 1D array given a specific window?

27条回答
  •  故里飘歌
    2020-11-22 09:13

    A bit late to the party, but I've made my own little function that does NOT wrap around the ends or pads with zeroes that are then used to find the average as well. As a further treat is, that it also re-samples the signal at linearly spaced points. Customize the code at will to get other features.

    The method is a simple matrix multiplication with a normalized Gaussian kernel.

    def running_mean(y_in, x_in, N_out=101, sigma=1):
        '''
        Returns running mean as a Bell-curve weighted average at evenly spaced
        points. Does NOT wrap signal around, or pad with zeros.
    
        Arguments:
        y_in -- y values, the values to be smoothed and re-sampled
        x_in -- x values for array
    
        Keyword arguments:
        N_out -- NoOf elements in resampled array.
        sigma -- 'Width' of Bell-curve in units of param x .
        '''
        N_in = size(y_in)
    
        # Gaussian kernel
        x_out = np.linspace(np.min(x_in), np.max(x_in), N_out)
        x_in_mesh, x_out_mesh = np.meshgrid(x_in, x_out)
        gauss_kernel = np.exp(-np.square(x_in_mesh - x_out_mesh) / (2 * sigma**2))
        # Normalize kernel, such that the sum is one along axis 1
        normalization = np.tile(np.reshape(sum(gauss_kernel, axis=1), (N_out, 1)), (1, N_in))
        gauss_kernel_normalized = gauss_kernel / normalization
        # Perform running average as a linear operation
        y_out = gauss_kernel_normalized @ y_in
    
        return y_out, x_out
    

    A simple usage on a sinusoidal signal with added normal distributed noise:

提交回复
热议问题