Dou*_*oug 3 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
Run Code Online (Sandbox Code Playgroud)
很多时候,像这样的函数会有一个“out”参数来写入结果。这个函数没有,所以我不能写入内存映射的 numpy 数组。
关于如何在大型 numpy 数组上进行内存高效距离变换计算的任何想法将不胜感激。谢谢。
您使用的是什么版本的 Scipy?在我运行的版本 (0.12.0) 中,没有out参数,因为有两个输出参数:distancesand indices,它们都可以用于输出。如果提供了这些并且是 ndarray 或子类的实例,则 scipy 将使用它们进行转换。从文档:
距离:ndarray,可选
用于距离数组的输出,必须是 float64 类型。
索引:ndarray,可选
用于索引的输出,必须是 int32 类型。
请注意,文档中有一个错字,至少在 0.12.0:distance应该是distances.
不幸的是,这似乎不是您的实际问题。您的实际问题似乎发生在 distance_transform_edtinput到二进制的转换中,这看起来像是复制了input...您的输入有多大?
基于 scipy 版本编写您自己的 distance_transform_edt 版本可能是值得的。它只有大约 50 行,其中大部分是处理各种输入/输出类型。
| 归档时间: |
|
| 查看次数: |
1039 次 |
| 最近记录: |