[英]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
具有topk
和argtopk
方法,您可以使用它们在分块数组中查找最大(或最小) 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.