Astropy строится на numpy и scipy. Numpy - это библиотека массивов нижнего уровня, которая реализует хранение данных и базовые c операции, которые используются библиотеками более высокого уровня, такими как scipy и astropy. Понимание того, как работают массивы numpy, поможет вам работать с астропией.
Поскольку вы хотите вести статистику в скользящем окне, что-то вроде scipy.stats.variation
не поможет вам напрямую. Он вычисляет статистику по элементам, сгруппированным по осям, а это не то, как сгруппированы ваши элементы. Вы можете смоделировать скользящее окно по осям, используя что-то вроде np.lib.stride_tricks.as_strided
, но это опасно, подвержено ошибкам и не очень эффективно. Вместо этого я предлагаю использовать метод свертки, аналогичный тому, что вы уже сделали.
Во-первых, помните, что дисперсия может быть выражена как
var = sum(x^2) / N - (sum(x) / N)^2
Итак, давайте сделаем это:
kernel = np.ones((3, 3))
mean_x = convolve(x, kernel, boundary='extend', preserve_nan=True)
mean_square_x = convolve(x**2, kernel, boundary='extend', preserve_nan=True)
Теперь у вас есть sum(x) / N
для каждого окна и sum(x^2) / N
. Стандартное отклонение - это просто квадрат root дисперсии:
std_x = np.sqrt(mean_square_x - mean_x**2)
Требуемый результат - это соотношение
result = std_x / mean_x
Вы можете выполнить все вычисления более кратко, как
m = convolve(x, kernel, boundary='extend', preserve_nan=True)
result = np.sqrt(convolve(x**2, kernel, boundary='extend', preserve_nan=True) - m**2) / m