groupby_bins在两个变量上?

时间:2016-11-07 12:18:11

标签: python-xarray

假设我有一个包含4124个测量值的数组nl。每个都与(latlon)对相关联,指定测量发生的位置。这些位置没有网格化,即它们没有与规则间隔的值对齐。

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

我为nl创建了一个DataArray,指定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与dash的集成。

2 个答案:

答案 0 :(得分:2)

目前正在进行多个维度的分组,但目前尚未在xarray中提供。

与此同时,有一些非常容忍的解决方法。例如,如果您创建第三个坐标,它是lat&的连续点。 lon,您可以按该坐标进行分组,以生成一组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) ...

答案 1 :(得分:0)

Here当我将SABRE卫星数据分类为区域性方式(即纬度和垂直方向)时,你可能会有点自负。