不是最精明的python用户,我一直在努力寻找一种解决方案来加速我的代码。 我有2个光栅文件,它们都具有相同的尺寸和范围。一个栅格是河流,从LIDAR图像中提取,具有较窄的高程值范围,河流文件中的所有其他值均为0.因此,除了河流宽度(具有高程数据的像素)之外,99%河栅格的值为0.另一个栅格文件是从LIDAR图像中提取的,并且在整个范围内都有高程数据。
我的计划是遍历河流文件中没有0值的每个像素,加1(如果河水位上升1米)并将其与邻近的像素高程数据进行比较(基本上是LIDAR高程的像素位置)。如果它更高,则给它一个值1(这意味着该像素被淹没)。 我提出的代码可以工作,但它看起来很糟糕,而且非常慢(油漆比代码运行的干燥速度快......) 所以我正在寻找一种方法来加快速度。我看了矢量化,numpy等,但还不清楚它(可能是因为我已经工作了9个多小时......)
所以在这里,任何建议都会非常感激:
river = arcpy.Raster(r'C:\Flood.gdb\Clip_River1')
lidar = arcpy.Raster(r'C:\Flood.gdb\Clip_Lidar_1')
arrayRiver = arcpy.RasterToNumPyArray(river,nodata_to_value=0)
(rHeight, rWidth)=arrayRiver.shape
arrayLidar = arcpy.RasterToNumPyArray(lidar,nodata_to_value=0)
(lHeight, lWidth)=arrayLidar.shape
# extent of the 2 rasters: columns 3822, rows 10129
flood = 1
while flood == 1:
flood = 0
for row in range(0,rHeight-1):
for col in range(0,rWidth-1):
if arrayRiver.item(row,col) <> 0 and arrayRiver[row,col] <> 1:
if arrayLidar[row,col-1] <> 1 and arrayLidar.item(row,col-1) < arrayRiver.item(row,col)+1:
arrayLidar[row,col-1] = 1
arrayRiver[row,col-1] = arrayRiver.item(row,col)
flood = 1
[....doing the same concept for each possible neighboring pixel]
if arrayLidar[row+1,col+1] <> 1 and arrayLidar.item(row+1,col+1) < arrayRiver.item(row,col)+1:
arrayLidar[row+1,col+1] = 1
arrayRiver[row+1,col+1] = arrayRiver.item(row,col)
flood = 1
arrayRiver[row,col] = 1
newRaster = arcpy.NumPyArrayToRaster(arrayLidar,lowerLeft,cellSize,value_to_nodata=0)
newRaster.save(r"C:\Flood.gdb\newRastaRiver_small")
newEmptyRaster = arcpy.NumPyArrayToRaster(arrayEmpty,lowerLeft,cellSize,value_to_nodata=0)
newEmptyRaster.save(r"C:\Flood.gdb\newEmptyRastaRiver_small")
答案 0 :(得分:1)
这只是部分答案,但应该让你开始。
使用numpy排除(掩盖)所有低值像素。
arrayRiver = arcpy.RasterToNumPyArray(river,nodata_to_value=0)
# Create a any array makring pixels less than zero.
mask = arrayRiver > 0
arrayRiver = arrayRiver[mask]
arrayLidar = arrayLidar[mask]
你的阵列&amp; arrayLidar现在应该小得多,代码的其余部分应该更快。顺便说一句,您的示例代码似乎没有创建arrayLidar数组。