Dask中项目分配的解决方法

时间:2020-06-25 11:30:28

标签: arrays numpy variable-assignment dask python-xarray

我在模型中有一段代码,可以在一天前根据另一个数组的值来转换数组。如果当前日期的最高温度低于前一天的最低温度,则该值应更改为当前日期前一天的最低温度的值。同样,当当天当前日期之前的最低温度高于前一天的最高温度时,该值应更改为当前日期之前一天的最高温度的值。我有两个版本都给出相同的错误,因为Dask数组不支持项目分配:

for ens in range(0,num_ens):
    for lat in range(0, num_lats):
        for lon in range(0, num_lons):
            for day in range(1, 240):
                if max_ens[ens, lat, lon, day] < min_ens[ens, lat, lon, day-1]:
                    max_ens[ens, lat, lon, day] = min_ens[ens, lat, lon, day-1]
                if min_ens[ens, lat, lon, day] > max_ens[ens, lat, lon, day-1]:
                    min_ens[ens, lat, lon, day] = max_ens[ens, lat, lon, day-1]

矢量化版本:

max_ens[:, :, :, day] = np.maximum(max_ens[:, :, :, day], min_ens[:, :, :, day - 1])
min_ens[:, :, :, day] = np.minimum(min_ens[:, :, :, day], max_ens[:, :, :, day - 1]) 

有人知道如何在Dask中高效地做到这一点吗?

谢谢!

编辑:

我一直在尝试实现where函数,但是在应用where函数时会调整数组的形状。

1 个答案:

答案 0 :(得分:1)

我将尝试仅使用numpy解决此问题,而不使用for循环或就地分配。我的猜测是,它可以与np.wherenp.rollnp.stack一起使用,或者可以通过聪明的广播来实现