我对python和numpy很新,所以请耐心等待。
我正在尝试创建一个用于水文目的的细胞自动机,更具体地说是洪水模型。我有2个栅格,一个DEM和一个含水位的光栅。有了这两个栅格,我想找到3x3邻域中的最低高度,然后计算中心单元和最低单元之间的水流量。
我在arcgis中找不到任何方法这样做,数据集非常大,所以numpy数组似乎是我最好的选择。到目前为止,我已经将两个栅格转换为numpy数组并创建了一个滚动窗口,该窗口遍历数组的每个单元格。该窗口是使用幻灯片技巧(http://arogozhnikov.github.io/2015/09/30/NumpyTipsAndTricks2.html)创建的。我知道我可以使用argmin获取最小值的索引,但我不知道如何将它与第二个数组组合。
我想要做的是创建滚动窗口,使其同时通过两个阵列,并使用邻域中最低高度的索引计算最低单元格和中心单元格之间的水流量。在计算水流量之后,转换规则将是基于水流量是否大于水位的if / else语句。所有这些都需要在滚动窗口内完成,我不确定如何做到这一点
非常感谢任何帮助。
修改
以下是我现在正在使用的代码:
import arcpy
import datetime
from arcpy import env
arcpy.env.overwriteOutput = True
import numpy as np
from numpy.lib.stride_tricks import as_strided
#Set environment and date variables to import DEM and Runnoff rasters
current_date = datetime.date.today() + datetime.timedelta(days=n)
date = str(current_date)
env.workspace = "Esri Geodatabase"
inDEM = "DEM"
inRaster = "C:/.../Q_" + date.replace("- ", "_") + ".tif"
outRaster = "C:/Esri.gdb/test"
#Retrieve raster properties for later export
dsc=arcpy.Describe(inRaster)
sr=dsc.SpatialReference
ext=dsc.Extent
ll=arcpy.Point(ext.XMin,ext.YMin)
#Import Runnoff and DEM as numpy arrays
Water_level = arcpy.RasterToNumPyArray(inRaster)
DEM = arcpy.RasterToNumPyArray(inDEM, nodata_to_value=3000)
#Create rolling window
def rolling_window(array, window_size):
itemsize = array.itemsize
shape = (array.shape[0] - window_size + 1,
array.shape[1] - window_size + 1,
window_size, window_size)
strides = (array.shape[1] * itemsize, itemsize,
array.shape[1] * itemsize, itemsize)
return np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)
我使用timedelta,因为在我完成这项工作后,我将在未来的N天内循环它。我还将3000分配给没有数据值,因为所有DEM值都低于2300,这样,nodata不会干扰。 DEM形状实际上是不规则的,所以如果有一种方法来掩盖nodata值,它就会很棒。
最初滚动窗口没有使用步幅技巧,我正在使用它来循环遍历文件:
for x, i in enumerate(window, 1):
for y, j in enumerate(i, 1):
我放弃这种方法的原因是它已经非常慢,阵列大约在3500x3500左右,当我添加zip函数来使用两个阵列时,它会更加如此。