强制相同块布局在Dask数组中相同形状和不同数据类型的数组

2024-03-28 19:39:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大型dask工作流,它生成两个具有相同形状但不同块(和数据类型)的不同阵列。我尝试对这些数组中的每一个进行重新分块(具有相同的块大小),但由于它们具有不同的数据类型,所以块是不同的。是否有一种方法可以强制这些数组中的每一个具有相同的块几何体,以便更容易地使用map数组函数(具体地说,我必须设计一个map_blocks函数,该函数同时在两个输入dask数组上迭代,并且具有相同的块将使这更容易实现)?这是一个重新创建问题的简化示例:

import dask.array as da 
import numpy as np
arrayOne  = da.random.random((96700000000), chunks=(96700000000))
arrayTwo = arrayOne >= 5
#they are the same
print(arrayOne.numblocks)
print(arrayTwo.numblocks)
#now rechunk to screw this up
arrayOne = arrayOne.rechunk({0: -1, 0: 'auto'},block_size_limit=1e6)
arrayTwo = arrayTwo.rechunk({0: -1, 0: 'auto'},block_size_limit=1e6)
print(arrayOne.numblocks)
print(arrayTwo.numblocks)

该代码输出:(1,)(1,)和(773600,),(96700,) 编辑: 解决这一问题的一个非常简单的方法是使用底层数据的大小,但我认为一定有更好的方法

arrayOne = arrayOne.rechunk({0: -1, 0: 'auto'},block_size_limit=1e6)
arrayTwo = arrayTwo.rechunk({0: -1, 0: 'auto'},block_size_limit=1e6/np.dtype(arrayOne.dtype).itemsize)

现在我能做些什么来强制这些数组中的每一个都有相同数量的块吗

谢谢,非常感谢您的帮助


Tags: 方法函数mapautosize数组blockdask
1条回答
网友
1楼 · 发布于 2024-03-28 19:39:51

在分块中使用"auto"选择特定内存大小的分块大小。这可能不是你想要的

相反,您可以考虑使用一个数组重新使用另一个块结构。

x = x.rechunk(y.chunks)

我还希望da.map_blocks能为您处理重新注册

相关问题 更多 >