【问题标题】:Item assignment for Dask arraysDask 数组的项目分配
【发布时间】:2020-06-29 22:26:32
【问题描述】:

我在模型中有一段代码,它根据前一天另一个数组的值转换数组。如果当日最高气温低于前一天最低气温,则该值应改为当日前一天最低气温的值。同样,当当日前一天的最低温度高于前一天的最高温度时,该值应改为当日前一天的最高温度值。我有两个版本都给出相同的错误,因为 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 函数时,数组的形状会被调整。

【问题讨论】:

    标签: python vectorization variable-assignment dask python-xarray


    【解决方案1】:

    我想很容易理解为什么Dask 数组不支持项分配?。这是因为数据仍然存储在硬盘上而不是内存中。因此,除非您想覆盖磁盘上的文件,否则无法分配或更改这些值。

    可能的解决方案是:

    1. 执行load()compute() 以便将数据加载到内存中。如果您的数据大于内存,您必须加载其中的一部分以适应您的内存(例如,每次加载缓冲一个 ens)。
    2. 分配新的var 来存储结果并将它们堆叠到新的ndarray 上。然后将新的ndarray 写入一个新文件。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      现在 dask 数组支持 assignment(来自版本 2021.04.1),怎么样:

      import numpy as np
      import dask.array as da
      
      # Set up some sample data
      min_ens = da.from_array(np.random.random(120).reshape(2, 3, 4, 5))
      max_ens = da.from_array(np.random.random(120).reshape(2, 3, 4, 5))
      
      # Define the operations (assuming that the "day" dimension is the last one)
      max_ens[..., 1:] = da.ufunc.maximum(max_ens[..., 1:], min_ens[..., :-1])
      min_ens[..., 1:] = da.ufunc.minimum(min_ens[..., 1:], max_ens[..., :-1])
      
      # Compute the result efficiently
      x, y  = da.compute(min_ens, max_ens)
      

      【讨论】:

        猜你喜欢
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        相关资源
        最近更新 更多