import numpy as np def make_continuous_copy(alpha): alpha = (alpha + np.pi) % (2.0 * np.pi) - np.pi continuous_x = np.zeros_like(alpha) continuous_x[0] = alpha[0] for i in range(1, len(alpha)): if not (np.sign(alpha[i]) == np.sign(alpha[i - 1])) and np.abs(alpha[i]) > np.pi / 2: continuous_x[i] = continuous_x[i - 1] + ( alpha[i] - alpha[i - 1]) - np.sign( (alpha[i] - alpha[i - 1])) * 2 * np.pi else: continuous_x[i] = continuous_x[i - 1] + (alpha[i] - alpha[i - 1]) return continuous_x def derivative_of(x, dt=1, radian=False): if radian: x = make_continuous_copy(x) if x[~np.isnan(x)].shape[-1] < 2: return np.zeros_like(x) dx = np.full_like(x, np.nan) dx[~np.isnan(x)] = np.gradient(x[~np.isnan(x)], dt) return dx