繁体   English   中英

计算 Netcdf 中极值的平均值 - Python

[英]Calculate average of extreme values in Netcdf - Python

我已经开始使用 Copernicus Marine Service 的大型数据集。 我正在通过 motuclient 下载 the.netcdf 文件,然后我可以处理(使用 xarray)数据以计算网格的每个 position 的平均值。 我想计算 20 个最高值(极值)的平均值。 我怎样才能做到这一点? 我可以使用 xarray 还是应该寻找其他东西? 我计算所有值的平均值的代码是:

ds = xr.open_mfdataset(file, engine="rasterio")
yearly_data = (ds).mean("time")

dask.array具有topkargtopk方法,您可以使用它们在分块数组中查找最大(或最小) k值。 您可以使用以下方法将其调整为 xarray:


In [52]: def topk_xr(da, n, dim):
    ...:     """get the largest n (or smallest if n is negative) along dim"""
    ...:     axis = da.get_axis_num(dim)
    ...:     largest = da.data.topk(n, axis=axis)
    ...:     dims = [d for d in da.dims if d != dim]
    ...:     dims.insert(axis, 'rank')
    ...:     res = xr.DataArray(
    ...:         largest,
    ...:         dims=dims,
    ...:         coords={
    ...:             'rank': range(0, abs(n)),
    ...:             **{d: da.coords[d] for d in da.dims if d != dim}
    ...:         },
    ...:     )
    ...:
    ...:     return res
    ...:

然后,您可以在 DataArray 上调用它,以沿您想要的任何维度获取前k个值:

In [54]: topk_xr(ds['myvar'], 20, dim='time')
Out[54]:
<xarray.DataArray 'topk_aggregate-aggregate-858fdf' (rank: 20, y: 10, x: 10)>
dask.array<topk_aggregate-aggregate, shape=(20, 10, 10), dtype=float64, chunksize=(20, 10, 10), chunktype=numpy.ndarray>
Coordinates:
  * rank     (rank) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  * y        (y) int64 20 21 22 23 24 25 26 27 28 29
  * x        (x) int64 -110 -109 -108 -107 -106 -105 -104 -103 -102 -101

同样,假设它们的形状相似,您可以在数据集中的所有 arrays 中对它进行 map:

In [57]: ds.map(topk_xr, n=20, dim='time')
Out[57]:
<xarray.Dataset>
Dimensions:  (rank: 20, y: 10, x: 10)
Coordinates:
  * rank     (rank) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  * y        (y) int64 20 21 22 23 24 25 26 27 28 29
  * x        (x) int64 -110 -109 -108 -107 -106 -105 -104 -103 -102 -101
Data variables:
    myarr    (rank, y, x) float64 dask.array<chunksize=(20, 10, 10), meta=np.ndarray>

如果你想找到这些最大值/最小值的位置索引,你可以使用argtopk而不是topk中的 topk。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM