2013-06-04 55 views
3

我正在使用GDAL工作在Python栅格上的项目。这些栅格或图像可能会变得很大,所以我通常在Numpy中使用内存映射来加载它们。目前我想对内存映射的Numpy阵列进行距离变换操作。我试图使用Scipy的distance_transform_edt函数,但是,这个函数返回结果的一个副本在内存中,我最终得到一个内存错误。如何使用Scipy进行高效的距离变换操作?

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阵列上的内存有效的距离变换计算将不胜感激。谢谢。

+2

在较小的切片上执行几个操作或修改代码以在原地执行操作。 – jfs

回答

4

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

距离:ndarray,可选

用于距离阵列的输出,必须是类型float64的。

指数:ndarray,可选

用于指数的输出,必须是Int32类型的。

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

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

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