2015-06-22 10 views
5

Oto mój problem: manipuluję 432*46*136*136 siatkami reprezentującymi time*(space) obejmowanymi w numpy tablice z numpy i python. Mam jedną tablicę alt, która obejmuje wysokości punktów siatki, i inną tablicę przechowującą temperaturę punktów siatki.Pseudonowa transformacja siatki liczb przy użyciu funkcji uniwersalnych

jest problematyczne dla porównania, jeśli T1 i T2 dwa rezultaty, T1[t0,z0,x0,y0] i T2[t0,z0,x0,y0] reprezentuje temperaturę H1[t0,z0,x0,y0] i liczników, odpowiednio. Ale chcę porównać temperaturę punktów na tej samej wysokości, a nie w tym samym punkcie siatki.

Dlatego chcę zmodyfikować oś Z moich matryc do reprezentowania wysokości, a nie punktu siatki. Tworzę funkcję conv(alt[t,z,x,y]), która przypisuje liczbę od -20 do 200 do każdej wysokości. Oto mój kod:

def interpolation_extended(self,temp,alt): 
    [t,z,x,y]=temp.shape 
    new=np.zeros([t,220,x,y]) 
    for l in range(0,t): 
     for j in range(0,z): 
      for lat in range(0,x): 
      for lon in range(0,y): 
       new[l,conv(alt[l,j,lat,lon]),lat,lon]=temp[l,j,lat,lon] 
    return new 

Ale to zdecydowanie za dużo czasu, nie mogę tego zrobić. Próbowałem napisać to za pomocą funkcji uniwersalnych za pomocą numpy:

def interpolation_extended(self,temp,alt): 
    [t,z,x,y]=temp.shape 
    new=np.zeros([t,220,x,y]) 
    for j in range(0,z): 
     new[:,conv(alt[:,j,:,:]),:,:]=temp[:,j,:,:] 
    return new 

Ale to nie działa. Czy masz jakiś pomysł na zrobienie tego w python/numpy bez użycia 4 zagnieżdżonych pętli?

Dziękuję

+0

Może to być spowodowane tym, że wywołania funkcji w Pythonie są kosztowne. Wstępna kalkulacja współrzędnej 'conv' z np. Pomocna może być metoda 'numf fromfunction'. – Ashalynd

+0

Czy z jest większy niż 220? W takim przypadku mogę zobaczyć, dlaczego Twój kod się zawiesił. – jfish003

+0

Czy 'conv' jest jakąkolwiek kombinacją liniową/funkcją' alt'? Czy możesz podać przykład lub opublikować swój kod dla 'conv'? Jeśli 'conv' może być wektoryzowany, możesz zapisać go w 1 linijce. –

Odpowiedz

3

Nie mogę spróbować kodu ponieważ nie mam swoich matryc, ale coś jak to powinno załatwić sprawę.

Po pierwsze, zamiast deklarowania conv jako funkcja, dostać całą projekcję wysokości dla wszystkich danych:

conv = np.round(alt/500.).astype(int) 

Korzystanie np.round, wersję numpys okrągłych, to zaokrągla wszystkie elementy macierzy przez Wektoryzacja operacje w C, a tym samym bardzo szybko otrzymujesz nową tablicę (przy prędkości C). Poniższa linia wyrównuje wysokości do rozpocząć się w 0 ° C, przez cały szereg przesuwa jego wartości minimalnej (w przypadku, -20):

conv -= conv.min() 

linia powyżej, przekształcić matrycy wysokości od -20, 200 [ ] do [0, 220] (lepiej do indeksowania).

Z tym, interpolacja można łatwo zrobić poprzez uzyskanie indeksów wielowymiarowych:

t, z, y, x = np.indices(temp.shape) 

się wektory powyżej zawierają wszystkie wskaźniki potrzebne do indeksu oryginalny matrycy. Następnie można utworzyć nową macierz, wykonując:

new_matrix[t, conv[t, z, y, x], y, x] = temp[t, z, y, x] 

bez żadnej pętli.

Daj mi znać, jeśli to działa. To może dać ci eros, ponieważ ciężko mi go przetestować bez danych, ale powinien wykonać to zadanie.


Poniższy przykład zabawka działa dobrze:

A = np.random.randn(3,4,5) # Random 3x4x5 matrix -- your temp matrix 
B = np.random.randint(0, 10, 3*4*5).reshape(3,4,5) # your conv matrix with altitudes from 0 to 9 
C = np.zeros((3,10,5)) # your new matrix 

z, y, x = np.indices(A.shape) 
C[z, B[z, y, x], x] = A[z, y, x] 

C zawiera wyniki według wysokości.

+0

To działa doskonale, dziękuję bardzo. Nie wiedziałem nawet o możliwości pracy z indeksami jako wektorami. Musiałem zmienić: 'conv = np.round (alt/500.)' na 'conv = np.round (alt/500.). Astype (int)' używać conv jako indeksów. –

+0

@Arnaud PROST thanks! Już edytowane. Wskaźniki wektorowe są bardzo przydatne. Na przykład: 'A [[3, 7, 8],:]' (dla tablicy 2D 'A') zwróci 4, 8 i 9 wiersz macierzy. Odpowiedź za pomocą 'np.indices' jest rozszerzeniem do tego poprzez indeksowanie wszystkich elementów wszystkich osi w tablicy wielowymiarowej. –

Powiązane problemy