gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:52 24 4
gpt4 key购买 nike

我正在用 Python 开发一个项目,使用 GDAL 来处理 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 数组上进行内存高效距离变换计算的想法将不胜感激。谢谢。

最佳答案

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

distance : ndarray, optional

Used for output of distance array, must be of type float64.

indices : ndarray, optional

Used for output of indices, must be of type int32.

请注意文档中有一个拼写错误,至少在 0.12.0 中是这样:distance 应该是 distances

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

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

关于python - 如何使用 Scipy 进行内存高效的距离变换操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16925596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com