gpt4 book ai didi

python - 使用 daa 深度处理大堆栈

转载 作者:行者123 更新时间:2023-12-01 03:18:36 25 4
gpt4 key购买 nike

我尝试处理一个大堆栈(我从 landsat 获取数组并制作堆栈,像 3d 矩阵一样时空),这是一个小例子:

import dask.array as da
import numpy as np

da_list = [da.from_array(np.full((int(1e3), int(1e3)), fill), (1000,1000)) for fill in [1,2,3,np.nan]]
stack = da.dstack(da_list)

print(da.nanmean(stack, axis=2).compute())

这个过程很好,但是它将整个堆栈加载到进程的内存中,如果堆栈更大,如下所示:

import dask.array as da
import numpy as np

da_list = [da.from_array(np.full((int(1e5), int(1e5)), fill), (1000,1000)) for fill in [1,2,3,np.nan]]
stack = da.dstack(da_list)

print(da.nanmean(stack, axis=2).compute())

但是这需要大量的内存用于进程,并行进程的最佳方法是什么并且不需要大量的内存用于进程?谢谢

最佳答案

首先,如果您确实想要np.full,则应该使用da.full。不过,我假设您只是使用 np.full 作为生成 numpy 数组的其他函数的示例。

答案是你不能立即调用你的函数,你需要延迟调用它,直到你真正需要结果。为此,请使用 dask.delayed

import dask.array as da
import numpy as np
from dask import delayed

delayed_list = [delayed(np.full)((1000, 1000), fill)
for fill in [1, 2, 3, np.nan]]

da_list = [da.from_delayed(d, shape=(1000, 1000), dtype=float)
for d in delayed_list]

stack = da.stack(da_list, axis=2)

>>> stack
dask.array<stack-0..., shape=(1000, 1000, 4), dtype=float64, chunksize=(1000, 1000, 1)>

到目前为止,您还没有真正完成任何工作。您从未调用过 np.full (或任何您的函数)。 Dask 仅在您指定后才开始调用这些函数,例如当您调用 .compute() 时。然而,它会按顺序调用这些函数,以便希望它可以在调用更多之前将一些大数组处理成小数组(例如通过使用nanmean)。

这篇博文可能提供更多信息:http://matthewrocklin.com/blog/work/2017/01/17/dask-images

关于python - 使用 daa 深度处理大堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42214714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com