Mam tutaj określony problem z wydajnością. Pracuję z prognoz meteorologicznych timeseries, które skompilować w numpy 2d tablicy tak, żeElegancka, zmienna zmiana szyku i wypełnianie NaN?
- dim0 = czas, w którym rozpoczyna serię prognozy
- dim1 = horyzont prognozy, np. 0 do 120 godzin
Teraz chciałbym, aby dim0 miał godzinne interwały, ale niektóre źródła podają prognozy tylko co N godzin. Jako przykład powiedz N = 3, a czas w dim1 to M = 1 godzina. Potem otrzymuję coś w rodzaju:
12:00 11.2 12.2 14.0 15.0 11.3 12.0
13:00 nan nan nan nan nan nan
14:00 nan nan nan nan nan nan
15:00 14.7 11.5 12.2 13.0 14.3 15.1
Ale oczywiście jest informacja o 13:00 i 14:00, ponieważ można ją wypełnić od godziny 12 z prognozą. Więc chciałbym skończyć z czymś takim:
12:00 11.2 12.2 14.0 15.0 11.3 12.0
13:00 12.2 14.0 15.0 11.3 12.0 nan
14:00 14.0 15.0 11.3 12.0 nan nan
15:00 14.7 11.5 12.2 13.0 14.3 15.1
Co to najszybszy sposób, aby dostać się tam, zakładając dim0 jest w porządku 1E4 i dim1 rzędu 1E2? Teraz robię to wiersz po wierszu, ale to jest bardzo powolny:
nRows, nCols = dat.shape
if N >= M:
assert(N % M == 0) # must have whole numbers
for i in range(1, nRows):
k = np.array(np.where(np.isnan(self.dat[i, :])))
k = k[k < nCols - N] # do not overstep
self.dat[i, k] = self.dat[i-1, k+N]
Jestem pewien, że musi być bardziej elegancki sposób to zrobić? Wszelkie wskazówki będą mile widziane.
Mógłbyś tłumacząc to inaczej, zgubiłem w zdaniu „Ale oczywiście. .. ". W jaki sposób różne źródła są reprezentowane w tablicy? Czy dim0 oznacza rzędy i dim1 = dimension1 = columns? – elyase
@lyase: Liczby są przesuwane w dół iw lewo, ponieważ na przykład, jeśli prognoza wynosi 12,2 godziny od teraz (o 12:00), to za godzinę prognoza będzie wynosiła 12,2 godziny zero od tego czasu (o 13:00). – unutbu