Я пытаюсь вычислить скользящую среднюю в большом массиве numpy, который содержит NaN. В настоящее время я использую:Рассчитать скользящее среднее в массиве numpy с NaNs
import numpy as np
def moving_average(a,n=5):
ret = np.cumsum(a,dtype=float)
ret[n:] = ret[n:]-ret[:-n]
return ret[-1:]/n
При расчете с замаскированным массивом:
x = np.array([1.,3,np.nan,7,8,1,2,4,np.nan,np.nan,4,4,np.nan,1,3,6,3])
mx = np.ma.masked_array(x,np.isnan(x))
y = moving_average(mx).filled(np.nan)
print y
>>> array([3.8,3.8,3.6,nan,nan,nan,2,2.4,nan,nan,nan,2.8,2.6])
Результатом Ищу (ниже) в идеале должны иметь пренебрежимы малый только в том месте, где исходный массив, х, были Nans и усреднение должны быть сделаны по числу элементов, не NaN в группировке (я нужен способ, чтобы изменить размер п в функции.)
y = array([4.75,4.75,nan,4.4,3.75,2.33,3.33,4,nan,nan,3,3.5,nan,3.25,4,4.5,3])
я мог цикл по всему массиву и с heck index по индексу, но массив, который я использую, очень велик, и это займет много времени. Существует ли несколько способов сделать это?
Итак, что '[4.75.4.75, nan, 4.4.3.75,2.33,3.33,4, nan, nan, 3,3.5, nan, 3.25]' ожидаемый выход? Если да, то почему существует «NaN» как третий элемент? – Divakar
@Divakar Это ожидаемый результат. В исходном массиве (x) в качестве третьей записи есть «nan». – krakenwagon
Итак, почему у нас есть NaN как вторая последняя запись в ожидаемом выходе? – Divakar