Source code for pyrfu.pyrf.compress_cwt

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 3rd party import
import numba
import numpy as np
import xarray as xr

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


@numba.jit(cache=True, fastmath=True, nopython=True, parallel=True)
def _compress_cwt_1d(cwt, nc: int = 100):
    nf = cwt.shape[1]
    idxs = np.arange(
        start=int(nc / 2),
        stop=len(cwt) - int(nc / 2),
        step=nc,
        dtype=np.int64,
    )
    cwt_c = np.zeros((len(idxs), nf))

    for i, idx in enumerate(idxs):
        for j in range(nf):
            x_data = cwt[idx - int(nc / 2) : idx + int(nc / 2), j]
            cwt_c[i, j] = np.nanmean(x_data)

    return cwt_c


[docs]def compress_cwt(cwt, nc: int = 100): r"""Compress the wavelet transform averaging of nc time steps. Parameters ---------- cwt : xarray.Dataset Wavelet transform to compress. nc : int, Optional Number of time steps for averaging. Default is 100. Returns ------- cwt_t : xarray.DataArray Sampling times. cwt_x : ndarray Compressed wavelet transform of the first component of the field. cwt_y : ndarray Compressed wavelet transform of the second component of the field. cwt_z : ndarray Compressed wavelet transform of the third component of the field. """ assert isinstance(cwt, xr.Dataset), "cwt must be an xarray.Dataset" indices = np.arange( int(nc / 2), len(cwt.time.data) - int(nc / 2), step=nc, dtype=np.int64, ) cwt_t = cwt.time.data[indices] cwt_x = _compress_cwt_1d(cwt.x.data, nc=nc) cwt_y = _compress_cwt_1d(cwt.y.data, nc=nc) cwt_z = _compress_cwt_1d(cwt.z.data, nc=nc) return cwt_t, cwt_x, cwt_y, cwt_z