【问题标题】:Get coordinates of non-nan values of xarray Dataset获取 xarray 数据集的非 nan 值的坐标
【发布时间】:2017-03-28 07:40:21
【问题描述】:

我有这个包含全球气温的示例数据集,更重要的是,一个面具 land,标记陆地/非水域。

<xarray.Dataset>
Dimensions:  (lat: 55, lon: 143, time: 5)
Coordinates:
  * time     (time) datetime64[ns] 2016-01-01 2016-01-02 2016-01-03 ...
  * lat      (lat) float64 -52.5 -50.0 -47.5 -45.0 -42.5 -40.0 -37.5 -35.0 ...
  * lon      (lon) float64 -177.5 -175.0 -172.5 -170.0 -167.5 -165.0 -162.5 ...
    land     (lat, lon) bool False False False False False False False False ...
Data variables:
    airt     (time, lat, lon) float64 7.952 7.61 7.389 7.267 7.124 6.989 ...

我现在可以掩盖海洋并绘制它

dry_areas = ds.where(ds.land)
dry_areas.airt.plot()

dry_areas 是这样的

<xarray.Dataset>
Dimensions:  (lat: 55, lon: 143)
Coordinates:
  * lat      (lat) float64 -52.5 -50.0 -47.5 -45.0 -42.5 -40.0 -37.5 -35.0 ...
  * lon      (lon) float64 -177.5 -175.0 -172.5 -170.0 -167.5 -165.0 -162.5 ...
    land     (lat, lon) bool False False False False False False False False ...
Data variables:
    airt     (lat, lon) float64 nan nan nan nan nan nan nan nan nan nan nan ...

我现在如何获取所有非 nan 值的坐标?

dry_areas.coords 给了我边界框,我无法将纬度和经度放入 (55, 143) 形状,因此我可以在上面应用蒙版。

我能找到的唯一可行的解​​决方法是 dry_areas.to_dataframe().dropna().reset_index()[['lat', 'lon']].values,感觉不是很瘦很干净。

我觉得这很简单,但我显然不是一个 numpy/matrix ninja。

迄今为止最好的解决方案

这是迄今为止我能想到的最短的:

lon, lat = np.meshgrid(ds.coords['lon'], ds.coords['lat'])
lat_masked  = ma.array(lat, mask=dry_areas.airt.fillna(False))
lon_masked  = ma.array(lon, mask=dry_areas.airt.fillna(False))
land_coordinates = zip(lat_masked[lat_masked.mask].data,     lon_masked[lon_masked.mask].data)

【问题讨论】:

    标签: numpy python-xarray


    【解决方案1】:

    您可以使用.stack 获取非空值的坐标对数组:

    In [31]: da=xr.DataArray(np.arange(20).reshape(5,4))
    In [33]: da_nans = da.where(da % 2 == 1)
    In [34]: da_nans
    Out[34]:
    <xarray.DataArray (dim_0: 5, dim_1: 4)>
    array([[ nan,   1.,  nan,   3.],
           [ nan,   5.,  nan,   7.],
           [ nan,   9.,  nan,  11.],
           [ nan,  13.,  nan,  15.],
           [ nan,  17.,  nan,  19.]])
    Coordinates:
      * dim_0    (dim_0) int64 0 1 2 3 4
      * dim_1    (dim_1) int64 0 1 2 3
    
    In [35]: da_stacked = da_nans.stack(x=['dim_0','dim_1'])
    
    In [36]: da_stacked
    Out[36]:
    <xarray.DataArray (x: 20)>
    array([ nan,   1.,  nan,   3.,  nan,   5.,  nan,   7.,  nan,   9.,  nan,
            11.,  nan,  13.,  nan,  15.,  nan,  17.,  nan,  19.])
    Coordinates:
      * x        (x) object (0, 0) (0, 1) (0, 2) (0, 3) (1, 0) (1, 1) (1, 2) ...
    
    
    In [37]: da_stacked[da_stacked.notnull()]
    Out[37]:
    <xarray.DataArray (x: 10)>
    array([  1.,   3.,   5.,   7.,   9.,  11.,  13.,  15.,  17.,  19.])
    Coordinates:
      * x        (x) object (0, 1) (0, 3) (1, 1) (1, 3) (2, 1) (2, 3) (3, 1) ...
    

    【讨论】:

    • 谢谢!还是有点复杂。这不应该是一个标准用例吗?
    • Tbh 我认为它应该尽可能简洁。但不是很有信心,PR 总是受欢迎的!
    • 你是对的,因为这实际上归结为只有 2 行: da_stacked = dry_areas.airt.stack(notnull=['lat','lon']) da_stacked[da_stacked.notnull() ]
    • 不过,stack 并没有准确地喊出“报告值的坐标”。至少,我认为这应该添加到 xarray “我该怎么做?”文档页面。更理想的是,我强烈建议将其打包成能够提供寻找所需值的功能。
    • 嗨@RobertP.Goldman!刚回来看到你的评论。希望一切都好。欢迎 PR!
    猜你喜欢
    • 2020-04-05
    • 2018-12-24
    • 1970-01-01
    • 2017-09-25
    • 2020-07-09
    • 2017-03-03
    • 1970-01-01
    • 2021-12-12
    • 2016-06-08
    相关资源
    最近更新 更多