2016-11-07 54 views
0

假設我有一個包含4124個測量值的數組nl。每個都與指定測量發生位置的(latlon)對關聯。這些位置沒有網格化,即它們沒有與規則間隔值對齊。關於兩個變量的groupby_bins?

In [51]: whos 
Variable Type   Data/Info 
--------------------------------- 
lat  ndarray  4124: 4124 elems, type `float32`, 16496 bytes 
lon  ndarray  4124: 4124 elems, type `float32`, 16496 bytes 
nl   ndarray  4124: 4124 elems, type `int16`, 8248 bytes 

我創建了一個DataArray中的nl,指定latlon爲座標:

nl = xr.DataArray(nl, coords={'lon':(['time'], lon), 'lat':(['time'], lat)}, dims=['time']) 

我知道我可以組經度和緯度的垃圾箱這些值來對它們進行操作,例如

nl_avg_lon = nl.groupby_bins('lon', np.r_[-180:190:10]).mean() 
nl_avg_lat = nl.groupby_bins('lat', np.r_[-90:90:10]).mean() 

我想要做的是在經度x緯度的二維分組中分組值,所以我可以顯示結果作爲地圖。我不認爲groupby_bins可以做到這一點,是否有另一種解決方案?

更新與例如:

這是我怎麼會做什麼,我想與numpy的正確:

latbins = np.r_[-90:100:10] 
lonbins = np.r_[-180:190:10] 
nsamples, xx, yy = np.histogram2d(lon, lat, bins=(lonbins, latbins)) 
nl_sum, xx, yy = np.histogram2d(lon, lat, bins=(lonbins, latbins), weights=nl) 
nl_avg = nl_sum/nsamples 

我想避免訴諸numpy的,以保持與前圍xarray一體化。

回答

1

目前正在對多個維度進行分組,但尚未在xarray中提供。

在此期間,有一些非常容忍的解決方法。例如,如果你創建第三個座標是lat & lon的CONCAT,您可以通過該組座標生成一組lat x lon

這裏有一個簡單的例子:

In [12]: da=xr.DataArray(np.random.rand(3,3,2), dims=['lat','lon','time']) 

In [13]: da 
Out[13]: 
<xarray.DataArray (lat: 3, lon: 3, time: 2)> 
array([[[ 0.69092373, 0.94961267], 
     [ 0.74086633, 0.22628054], 
     [ 0.08215398, 0.16806347]], 

     [[ 0.67699002, 0.86242477], 
     [ 0.54688503, 0.57882117], 
     [ 0.21120849, 0.68743872]], 

     [[ 0.43816928, 0.57682212], 
     [ 0.10402045, 0.78923986], 
     [ 0.53284326, 0.23705761]]]) 
Coordinates: 
    * lat  (lat) int64 0 1 2 
    * lon  (lon) int64 0 1 2 
    * time  (time) int64 0 1 

In [14]: da.stack(latlon=['lat','lon']) 
Out[14]: 
<xarray.DataArray (time: 2, latlon: 9)> 
array([[ 0.69092373, 0.74086633, 0.08215398, 0.67699002, 0.54688503, 
     0.21120849, 0.43816928, 0.10402045, 0.53284326], 
     [ 0.94961267, 0.22628054, 0.16806347, 0.86242477, 0.57882117, 
     0.68743872, 0.57682212, 0.78923986, 0.23705761]]) 
Coordinates: 
    * time  (time) int64 0 1 
    * latlon (latlon) object (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) ... 

In [15]: da.stack(latlon=['lat','lon']).groupby('latlon').mean() 
Out[15]: 
<xarray.DataArray (latlon: 9)> 
array([ 0.8202682 , 0.48357344, 0.12510872, 0.76970739, 0.5628531 , 
     0.44932361, 0.5074957 , 0.44663016, 0.38495044]) 
Coordinates: 
    * latlon (latlon) object (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) ... 
+0

我不知道我明白。你是否建議在新維度上連接'lat'和'lon'?或沿'nx'維度?在這兩種情況下,我認爲新創建的座標尺寸與'nl'變量的尺寸不兼容。我誤解了什麼? –

+0

請注意,'nl'變量*不是*二維的。有一個獨特的維度(例如時間)。沿該維度的每個nl點都與緯度和經度相關聯。在上面的'nl'例子中,'lat'和'lon'座標是平行的,可以這麼說。 –

+0

剛剛添加了一個例子,這是否更有意義? – Maximilian

0

Here可以ispire當我將SABRE衛星數據分成緯向和垂直分區方式時,我自己就有點兒了。