ArcPy和NumPy:处理Landsat 8图像的内存错误

2024-10-02 18:28:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用ArcPy(有经验的)和NumPy(新手)比较NDVI calculations,但在下面的脚本所示的行中遇到了MemoryError。在

^{}创建的数组的形状和数据类型是(8191, 8101)和{}。这是一个标准的陆地卫星8号图像的大小。在

这是一个不合理的尺寸期望处理?division提升数据类型以容纳小数(diff和{}成功完成)的问题吗?如果是这样的话,我可以强制一个整数输出吗?在

import cProfile, numpy
def arcpyNDVI():
    NIRras = arcpy.Raster("LC80460222013184LGN00_B5.TIF")
    REDras = arcpy.Raster("LC80460222013184LGN00_B4.TIF")
    NDVIap = (NIRras - arcpy.sa.Float(REDras))/ (NIRras + REDras)
    NDVIap.save(r'C:/junk/ap_ras.tif')
def numpyNDVI():
    NIRras = arcpy.Raster("LC80460222013184LGN00_B5.TIF")
    NIRll = arcpy.Point(NIRras.extent.XMin,NIRras.extent.YMin)
    NIRcs = NIRras.meanCellWidth
    REDras = arcpy.Raster("LC80460222013184LGN00_B4.TIF") 
    arcpy.env.outputCoordinateSystem = NIRras.spatialReference
    NIRnp = arcpy.RasterToNumPyArray(NIRras)
    REDnp = arcpy.RasterToNumPyArray(REDras)
    diff = NIRnp - REDnp
    sum = NIRnp + REDnp
    NDVInp = diff / sum # MEMORY ERROR HERE
    NDVInpRas = arcpy.NumPyArrayToRaster(NDVInp,NIRll,NIRcs,NIRcs)
    NDVInpRas.save(r'C:/junk/np_ras.tif')
cProfile.runctx('arcpyNDVI()',None,locals())
cProfile.runctx('numpyNDVI()',None,locals())

更新1:上面的脚本有时运行到完成(有时给出MemoryError),但它输出uint16,而我需要小数。换行后: NDVInp = diff / sum到:NDVInp = numpy.true_divide(diff,sum),我一直得到:

^{pr2}$

Tags: 脚本diffcprofilesumrasterarcpytifmemoryerror
1条回答
网友
1楼 · 发布于 2024-10-02 18:28:09

答案似乎是使用del语句释放内存,尽早删除变量。如果有人想评论这是否是numpy脚本(或Python,一般来说)的常见/最佳实践,我会洗耳恭听。以下是我的工作脚本:

import numpy
NIRras = arcpy.Raster("LC80460222013184LGN00_B5.TIF")
NIRll = arcpy.Point(NIRras.extent.XMin,NIRras.extent.YMin)
NIRcs = NIRras.meanCellWidth
REDras = arcpy.Raster("LC80460222013184LGN00_B4.TIF") 
arcpy.env.outputCoordinateSystem = NIRras.spatialReference
NIRnp = arcpy.RasterToNumPyArray(NIRras)
del NIRras
REDnp = arcpy.RasterToNumPyArray(REDras)
del REDras
diff = NIRnp - REDnp
sum = NIRnp + REDnp
del NIRnp, REDnp
NDVInp = numpy.true_divide(diff,sum) # MEMORY ERROR HERE
NDVInpRas = arcpy.NumPyArrayToRaster(NDVInp,NIRll,NIRcs,NIRcs)
del NDVInp, NIRll, NIRcs
NDVInpRas.save(r'C:/junk/np_ras.tif')
del NDVInpRas

相关问题 更多 >