我如何使用Scipy做一个内存高效的距离转换操作



我正在使用GDAL在GIS光栅上工作的Python项目上工作。这些光栅或图像可能会变得相当大,所以我通常使用Numpy中的内存映射来加载它们。目前我想在内存映射Numpy数组上做一个距离变换操作。我试图使用Scipy的distance_transform_edt函数,然而,这个函数在内存中返回结果的副本,我最终得到一个内存错误。

561, in distance_transform_dataset
    dest_array = ndimage.distance_transform_edt(source_array) * pixel_size
File "/usr/local/lib/python2.7/dist-packages/scipy/ndimage/morphology.py", line 2173,   
    in distance_transform_edt
input = numpy.atleast_1d(numpy.where(input, 1, 0).astype(numpy.int8))
MemoryError
None    
很多时候,像这样的函数会有一个'out'参数来写入结果。这个函数没有,所以我不能写入内存映射的numpy数组。

任何关于如何在大型numpy数组上进行内存高效距离转换计算的想法将非常感谢。谢谢。

您使用的是哪个版本的Scipy ?在我运行的版本(0.12.0)中,没有out参数,因为有两个输出参数:distancesindices,它们都可以用于输出。如果提供了这些,并且是narray或子类的实例,则sciy将使用它们进行相应的转换。来自文档:

distance: narray,可选

用于距离数组的输出,类型必须为float64。

indexes: narray,可选

用于输出索引,类型必须为int32。

注意文档中有一个错别字,至少在0.12.0中:distance应该是distances

不幸的是,这似乎不是你的实际问题。您的实际问题似乎发生在distance_transform_edt将input转换为二进制时,这看起来像是复制了input…你的输入有多大?

基于scipy版本编写自己的distance_transform_edt版本可能是值得的。它只有大约50行,其中大部分是处理各种输入/输出类型。

最新更新