2016-08-07 31 views
1

Ich habe zwei verschiedene Xarray-Datasets mit unterschiedlichen Breiten- und Längengridauflösungen. Ich möchte das eine Xarray mit niedriger Auflösung auf die gleiche Auflösung wie das eine Xarray mit höherer Auflösung neu regraphen. Ich habe einige Beispiele gefunden (z. B. http://earthpy.org/interpolation_between_grids_with_basemap.html), aber es funktioniert nicht für mich. Hier ist ein Beispiel, das ich für den Test gemacht:Interpolation zwischen zwei Xarray-Datasets mit Basemap

import numpy as np 
import xarray as xray 
import mpl_toolkits.basemap 

var1=xray.DataArray(np.random.randn(len(np.linspace(40.5,49.5,10)),len(np.linspace(-39.5,-20.5,20))),coords=[np.linspace(40.5,49.5,10), np.linspace(-39.5,-20.5,20)],dims=['lat','lon']) 

(xlon, xlat)=np.meshgrid(np.linspace(-39.875,-20.125,80),np.linspace(40.125,49.875,40)) 
var2=xray.DataArray(-xlon**2+xlat**2,coords=[np.linspace(40.125,49.875,40),np.linspace(-39.875,-20.125,80)],dims=['lat','lon']) 

mpl_toolkits.basemap.interp(var1,var1.lon,var1.lat,var2.lon,var2.lat,checkbounds=False,masked=False,order=0) 

bekomme ich folgende Fehlermeldung:

ValueError: xout and yout must have same shape!

Screenshot: see screenshot

Hat basemap.interp() erfordern xout und yout werden die gleiche Form? Also muss var2 ein Quadrat sein? Dies ist bei meinen Datensätzen fast nie der Fall! Wie kann ich reg1 var1 die gleiche Auflösung wie var2 regrid?

Hinweis: Nach der Neuberechnung möchte ich var1 unterteilen einige Bedingung im Zusammenhang mit var2. Zum Beispiel:

var1_subset = var1.where(var2>1000) 

Also ich möchte jeden Verlust von Rasterpunkten während der Interpolation minimieren.

Antwort

1

basemap.interp wird nur funktionieren, wenn xout und yout in Zahl oder Anzahl der Ausgangs nlons gleich sind und nlats sind gleich,

warum erzeugen nicht gleiche Länge Ausgang nlats und nlons und später Teilmenge.

Zum Beispiel:

import numpy as np 
import xarray as xray 
import mpl_toolkits.basemap 
var1=xray.DataArray(np.random.randn(len(np.linspace(40.5,49.5,10)),len(np.linspace(-39.5,-20.5,20))),coords=[np.linspace(40.5,49.5,10), np.linspace(-39.5,-20.5,20)],dims=['lat','lon']) 

(xlon,xlat)=np.meshgrid(np.linspace(-39.875,20.125,80),np.linspace(40.125,49.875,80)) 
var2=xray.DataArray(-xlon**2+xlat**2,coords[np.linspace(40.125,49.875,80),np.linspace(-39.875,-20.125,80)],dims=['lat','lon']) 
mpl_toolkits.basemap.interp(var1,var1.lon,var1.lat,var2.lon,var2.lat,checkbounds=False,masked=False,order=0) 

Hier ist ein weiterer cooler Trick mit xarray.

lonreg=var1.groupby_bins('lon',np.linspace(-39.875,20.125,80)).mean(dim='lon') 

regridded=lonreg.groupby_bins('lat',np.linspace(-39.5,20.5,20)).mean(dim='lat') 

wenn Sie gewichteter Durchschnitt regridding wollen, ist es leicht, dies für die Fläche zu erweitern gemittelt regridding durch Gewichte und Summenfunktion auf groupby Objekt.