def cmov_window(data, span, window_type): """Applies a centered moving window of type window_type and size span on the data. Returns a (subclass of) MaskedArray. The k first and k last data are always masked (with k=span//2). When data has a missing value at position i, the result has missing values in the interval [i-k:i+k+1]. :Parameters: data : ndarray Data to process. The array should be at most 2D. On 2D arrays, the window is applied recursively on each column. span : integer The width of the window. window_type : string/tuple/float Window type (see Notes) Notes ----- The recognized window types are: boxcar, triang, blackman, hamming, hanning, bartlett, parzen, bohman, blackmanharris, nuttall, barthann, kaiser (needs beta), gaussian (needs std), general_gaussian (needs power, width), slepian (needs width). If the window requires parameters, the window_type argument should be a tuple with the first argument the string name of the window, and the next arguments the needed parameters. If window_type is a floating point number, it is interpreted as the beta parameter of the kaiser window. Note also that only boxcar has been thoroughly tested.""" data = marray(data, copy=True, subok=True) if data._mask is nomask: data._mask = N.zeros(data.shape, bool_) window = get_window(window_type, span, fftbins=False) (n, k) = (len(data), span//2) # if data.ndim == 1: data._data.flat = convolve(data._data, window)[k:n+k] / float(span) data._mask[:] = ((convolve(getmaskarray(data), window) > 0)[k:n+k]) elif data.ndim == 2: for i in range(data.shape[-1]): _data = data._data[:,i] _data.flat = convolve(_data, window)[k:n+k] / float(span) data._mask[:,i] = (convolve(data._mask[:,i], window) > 0)[k:n+k] else: raise ValueError, "Data should be at most 2D" data._mask[:k] = data._mask[-k:] = True return data