Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于dask的三维体处理_Python_Multidimensional Array_Filtering_Convolution_Dask - Fatal编程技术网

Python 基于dask的三维体处理

Python 基于dask的三维体处理,python,multidimensional-array,filtering,convolution,dask,Python,Multidimensional Array,Filtering,Convolution,Dask,我现在正在探索使用dask的一些简单模板的3D交互式体积卷积。 让我解释一下我的意思: 假设您有一个要通过Sobel变换处理的3D数据(例如获得L1或L2渐变) 然后将输入的3D图像划分为子卷(具有一些重叠边界–对于3x3x3模具Sobel,需要+2个样本重叠/填充) 现在,假设您在整个3D体积上创建了Sobel 3D变换的延迟计算,但尚未执行 现在最重要的部分是: 我想写一个函数,它将从虚拟转换的数据中提取一些特定的2D部分 最后让dask计算所有内容: 但是我需要dask做的不是为我

我现在正在探索使用dask的一些简单模板的3D交互式体积卷积。 让我解释一下我的意思:

  • 假设您有一个要通过Sobel变换处理的3D数据(例如获得L1或L2渐变)
  • 然后将输入的3D图像划分为子卷(具有一些重叠边界–对于3x3x3模具Sobel,需要+2个样本重叠/填充)
  • 现在,假设您在整个3D体积上创建了Sobel 3D变换的延迟计算,但尚未执行
现在最重要的部分是:

  • 我想写一个函数,它将从虚拟转换的数据中提取一些特定的2D部分
  • 最后让dask计算所有内容:
    • 但是我需要dask做的不是为我计算整个变换,然后提供一个部分。
      • 我只需要它来执行那些需要计算特定2D变换图像切片的任务
你认为有可能吗?

为了用图像来解释它,请考虑这是一个三维区域分解(这是从DWT -但很好的说明):

并假设有一个函数使用dask计算整个体积的3D变换。 但我想得到的是,例如,转换后的3D数据的2D图像,它由LLL1、LLH1、HLH1、HLL1平面组成(基本上是一个切片)

重要的部分不是计算整个子多维数据集,而是让dask以某种方式自动跟踪计算图中的依赖项,并仅计算这些依赖项。

请不要担心计算v.s.拷贝时间。 假设它有完美的比率

如果需要更多的澄清,请告诉我!
谢谢你的帮助

我听到一些问题。我会逐一回答

  • Dask能否跟踪输出子集需要哪些任务,并仅计算这些任务?
对。延迟Dask操作生成依赖关系图。在dask.array的情况下,该图是每个区块的。如果您的输出仅依赖于图的子集,那么Dask将删除不必要的任务。这方面的深入文档是,特别是优化

作为一个例子,考虑100000×100000数组< /P>
>>> x = da.random.random((100000, 100000), chunks=(1000, 1000))
假设我从中添加了几个1d切片

>>> y = x[5000, :] + x[:, 5000].T
得到的优化图只够计算输出

>>> graph = y._optimize(y.dask, y._keys())  # you don't need to do this
>>> len(graph)                              # it happens automatically
301
我们可以很快计算出结果:

In [8]: %time y.compute()
CPU times: user 3.18 s, sys: 120 ms, total: 3.3 s
Wall time: 936 ms
Out[8]: 
array([ 1.59069994,  0.84731881,  1.86923216, ...,  0.45040813,
        0.86290539,  0.91143427])
现在,这并不完美。它必须产生我们的两片所接触的所有1000x1000块。但是您可以在那里控制粒度

简短回答:Dask将自动检查图形,并仅运行评估输出所需的任务。你不需要做任何特别的事情来做这件事

  • 使用dask.array进行重叠数组计算是个好主意吗?

也许吧。相关文档页面位于此处。数组具有方便的函数,使其易于写入。但是,它将创建内存中的副本。在你的位置上,很多人觉得memcopy太慢了。Dask通常不支持就地计算,因此我们不能像适当的MPI代码那样高效。不过,我将把性能问题留给您。

不是为了贬低@MRocklin精心设计的答案,而是为了补充更多内容

我还经常发现自己需要对大规模阵列数据进行边缘检测和其他图像处理技术。由于Dask是一个非常好的库,用于在大型阵列数据上构建和探索此类计算工作流,因此我们在一个名为的GitHub组织中为一些常见的图像处理技术整合了一些实用程序库。它们主要是为了模仿SciPy的API而设计的

至于在Dask中使用Sobel运算符,可以使用(许可)中的此函数在Dask阵列上执行此操作。它在引擎盖下面的模块上处理适当的光晕,返回一个新的Dask阵列

由于SciPy函数(以及dask ndfilters的sobel函数)在一维上运行,因此需要在每个轴和堆栈上进行映射,以获得完整的sobel运算符结果。也就是说,这是非常简单的。下面是一个简短的片段,展示了如何在随机Dask数组上执行此操作。还包括沿XZ平面进行切片。尽管可以轻松地获取任何其他切片或对数据执行其他操作

希望这有帮助。:)

将dask.array导入为da
作为数据过滤器导入数据过滤器
d=da.random.random((100120140),chunks=(25,30,35))
ds=da.stack([da_ndfilt.sobel(d,轴=i)表示范围内的i(d.ndim)])
dsp=ds[:,:,0,:]
asp=dsp.compute()