我试图使用ArcPy(有经验的)和NumPy(新手)比较NDVI calculations,但在下面的脚本所示的行中遇到了MemoryError
。在
由^{(8191, 8101)
和{
这是一个不合理的尺寸期望处理?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)
,我一直得到:
答案似乎是使用
del
语句释放内存,尽早删除变量。如果有人想评论这是否是numpy脚本(或Python,一般来说)的常见/最佳实践,我会洗耳恭听。以下是我的工作脚本:相关问题 更多 >
编程相关推荐