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ę
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
Czy z jest większy niż 220? W takim przypadku mogę zobaczyć, dlaczego Twój kod się zawiesił. – jfish003
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. –