首页 > 解决方案 > 如何在 3d 数组上执行 xarray 中的函数,预先过滤它以获取预定义节点?

问题描述

我在将函数应用于xarray.dataset. 我有气候数据,我想计算某个区域的加权平均值(点列表中的坐标)。该示例串行运行,但我不知道如何在 dask 集群上并行执行。

结果应该是每个坐标列表的时间序列。因此,这不应作为返回值使用,而必须存储在 MongoDB 中。

import xarray as xr
import numpy as np

nlats = 10
nlons = 8
ntimes = 100

ctime = range(ntimes)
clat = range(nlats)
con = range(nlons)


tas = np.random.randn(ntimes, nlats, nlons)
pr = np.random.rand(ntimes, nlats, nlons)


ds = xr.Dataset(
    data_vars=dict(
        tas=(["time", "lat", "lon"], tas),
        pr=(["time", "lat", "lon"], pr),
    ),
    coords=dict(
        time=ctime,
    ),
)


pointlist = [
            [(c[0], c[1]) for c in zip(np.random.randint(0,nlats, 4),np.random.randint(0,nlons, 4))],
            [(c[0], c[1]) for c in zip(np.random.randint(0,nlats, 3),np.random.randint(0,nlons, 3))],
            [(c[0], c[1]) for c in zip(np.random.randint(0,nlats, 5),np.random.randint(0,nlons, 5))]
        ]
    

def calc_mean(df, points):
    points = np.array(points)
    
    dssel = df.tas.isel(lat=xr.DataArray(points[:,0], dims="sel"), 
            lon=xr.DataArray(points[:,1], dims="sel"))
    
    return dssel.mean(dim='sel')


results = [calc_mean(ds.tas, points) for points in pointlist]

标签: pythonparallel-processingpython-xarray

解决方案


推荐阅读