Python - 循环使用栅格单元格,速度极慢

时间:2015-04-30 21:43:30

标签: python numpy raster

不是最精明的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")

1 个答案:

答案 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数组。