Интерполяция поля 3-dim (время, широта, долгота) с _FillValue в Python. Как избежать зацикливания?

#python #scipy #remap

Вопрос:

Я интерполирую данные из океанического компонента моделей CMIP6 в сетку 2×2. Поле имеет значения dim (время, nav_lat, nav_lon) и nan в континенте. Здесь nav_lon и nav_lat представляют собой двумерную криволинейную сетку. Я могу выполнить интерполяцию с помощью griddata из scipy, но мне придется использовать цикл с течением времени. Цикл делает его довольно медленным, если данные содержат тысячи записей о времени. Мой вопрос в том, как векторизовать интерполяцию с течением времени.

Ниже приведен мой код:

 import xarray as xr
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt

source = xr.open_dataset('data/zos_2850.nc',decode_times=False)

# obtain old lon and lat (and put lon in 0-360 range)
# nav_lon is from -180 to 180, not in 0-360 range
loni, lati = source.nav_lon.values60, source.nav_lat.values

# flatten the source coordinates
loni_flat, lati_flat = loni.flatten(), lati.flatten()

# define a 2x2 lon-lat grid
lon, lat = np.linspace(0,360,181), np.linspace(-90,90,91) 

# create mesh
X, Y = np.meshgrid(lon,lat)

# loop over time
ntime = len(source.time)
tmp = []
for t in range(ntime):  
    print(t)
    var_s = source.zos[t].values
    var_s_flat = var_s.flatten()

    # index indicates where they are valid values
    index = np.where(~np.isnan(var_s_flat))
    # remap the valid values to the new grid 
    var_t = griddata((loni_flat[index],lati_flat[index]),var_s_flat[index], (X,Y), 
    method='cubic')
    
    # interpolate mask using nearest
    maskinterp = griddata((loni_flat,lati_flat),var_s_flat, (X,Y), method='nearest')
    # re-mask interpolated data
    var_t[np.isnan(maskinterp)] = np.nan

tmp.append(var_t)

# convert to DataArray
da = xr.DataArray(data=tmp, 
              dims=["time","lat","lon"], 
              coords=dict(lon=(["lon"], lon),lat=(["lat"], lat),time=source['time']))  
 

Комментарии:

1. Я не работаю с сеточными данными, но мне интересно, можете ли вы проецировать каждый период времени на подрешетку более крупной сетки, например, с псевдоконтинентами, отделяющими каждый временной участок от следующего.