【问题标题】:groupby_bins on two variables?groupby_bins 两个变量?
【发布时间】:2016-11-10 17:23:54
【问题描述】:

假设我有一个数组nl,其中包含 4124 个测量值。每个都与(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'])

我知道我可以将这些值分组到经度或纬度的 bin 中以对它们进行操作,例如

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 纬度的 2D 箱中对值进行分组,因此我可以将结果显示为地图。我不认为 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 的集成。

【问题讨论】:

    标签: python-xarray


    【解决方案1】:

    目前正在处理按多维分组,但在 xarray 中尚不可用。

    与此同时,有一些非常可容忍的解决方法。例如,如果您创建第三个坐标,它是latlon 的连接,您可以按该坐标进行分组以生成一组lat x lon bins

    这是一个简短的例子:

    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) ...
    

    【讨论】:

    • 我不确定我是否理解。您是否建议将latlon 沿着一个新维度连接起来?还是沿着nx 维度?在这两种情况下,我认为新创建的坐标的尺寸与nl 变量的尺寸不兼容。我误会了什么?
    • 请注意nl 变量不是二维的。有一个独特的维度(例如时间)。沿该维度的每个 nl 点都与一个纬度和一个经度相关联。在上面的 nl 示例中,latlon 坐标是平行的,可以这么说。
    • 刚刚加了一个例子,这样更有意义吗?
    • 我不确定您的建议是否可行。 lat 和 lon 是坐标,但不是维度。我的值没有按(经度、纬度、时间)索引。正如我上面提到的,只有一个维度,即时间。我的值由(时间)索引,坐标也是:lon(时间),lat(时间)。
    • 我明白了。我认为有可能破解,但主要的斗争将是“2d”直方图部分 - xarray 目前不会按超过一维进行分组。所以解决它的唯一方法是从两个中制作一个坐标/维度......
    【解决方案2】:

    Here 当我将 SABRE 卫星数据按纬向和垂直方向分档时,你可以给自己一点灵感。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2012-11-21
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多