Numpy 获取xarray数据集的非nan值的坐标

Numpy 获取xarray数据集的非nan值的坐标,numpy,python-xarray,Numpy,Python Xarray,我有一个包含全球气温的样本数据集,更重要的是,还有一个标记陆地/非水域的面具 <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.

我有一个包含全球气温的样本数据集,更重要的是,还有一个标记陆地/非水域的面具

<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 ...
干燥区域
如下所示

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

您可以使用
.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) ...
[31]中的
:da=xr.DataArray(np.arange(20).重塑(5,4))
在[33]中:da_nans=da.where(da%2==1)
在[34]中:大南
出[34]:
数组([[nan,1.,nan,3.],
[nan,5.,nan,7.],
[nan,9,nan,11.],
[nan,13,nan,15.],
[nan,17,nan,19.]
协调:
*尺寸0(尺寸0)int64 0 1 2 3 4
*尺寸1(尺寸1)int64 01 2 3
在[35]中:da_stacked=da_nans.stack(x=['dim_0','dim_1']
In[36]:dau
出[36]:
数组([nan,1.,nan,3.,nan,5.,nan,7.,nan,9.,nan,
11、楠、13、楠、15、楠、17、楠、19.)
协调:
*x(x)对象(0,0)(0,1)(0,2)(0,3)(1,0)(1,1)(1,2)。。。
在[37]中:da_stacked[da_stacked.notnull()]
出[37]:
数组([1,3,5,7,9,11,13,15,17,19.]))
协调:
*对象(0,1)(0,3)(1,1)(1,3)(2,1)(2,3)(3,1)。。。

谢谢!在我看来还是有点复杂。这不是一个标准的用例吗?Tbh我认为它应该尽可能简洁。但没有太多的信心和PRs总是欢迎!你是对的,因为这实际上只归结为两行:dau stacked=dry_areas.airt.stack(notnull=['lat','lon'])dau stacked[dau stacked.notnull()],但是,
stack
并没有准确地喊出“报告值的坐标”。至少,我认为这应该添加到xarray的“我该怎么做?”文档页面中。更理想的情况是,我敦促将其打包成能够提供寻找所需价值的东西。Hi@RobertP.Goldman!回到这里,看到了你的评论。希望一切顺利。欢迎光临!
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)
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) ...