如何使用Scipy进行内存有效的距离变换操作?

时间:2013-06-04 19:07:51

标签: python memory numpy scipy

我正在使用GDAL开发一个Python项目来处理GIS栅格。这些栅格或图像可能会变得相当大,所以我通常在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阵列上进行内存有效距离变换计算的任何想法都将非常受欢迎。谢谢。

1 个答案:

答案 0 :(得分: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行,其中大多数都处理各种输入/输出类型。