2016-11-07 69 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卫星数据分成纬向和垂直分区方式时,我自己就有点儿了。