我有一个问题,我们应该编写一个函数,当给定二维数组的输入时,它将返回每个索引的最低值相邻索引的行和列中的偏移量;一个数组表示每个索引的偏移量(以行为单位),一个数组表示每个索引的偏移量(以列为单位)。例如,如果索引的最低相邻单元格在下一行右一列,则偏移量为 1,1;如果最低相邻单元格在左侧,则偏移量为 0,-1;如果它是其相邻单元格中的最低单元格,则偏移量为 0,0。
因为我找不到更快和正确的方法来执行此操作,所以我编写了一个 while 循环,该循环将遍历每个索引并查看点 [i,j] 的哪些周围索引低于所有其他周围索引使用 a.all():
def findLowNhbr( terrain ):
"""Creates two 2D-arrays the shape of terrain consisting
of the offsets (row and column) to the neighbor with the minimum eleveation"""
rowOffset = np.zeros_like(terrain)
colOffset = np.zeros_like(terrain)
for i in range(len(terrain)):
if i == 0:
rowOffset[i] = 0
colOffset[i] = 0
elif i == (len(terrain)-1):
rowOffset[i] = 0
colOffset[i] = 0
else:
for j in range(len(terrain[i])):
if j == 0 or j == len(terrain[i])-1:
rowOffset[:,j] = 0
colOffset[:,j] = 0
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i-1,j-1]).all():
rowOffset[i,j] = -1
colOffset[i,j] = -1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i,j-1]).all():
rowOffset[i,j] = 0
colOffset[i,j] = -1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i+1,j-1]).all():
rowOffset[i,j] = 1
colOffset[i,j] = -1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i-1,j]).all():
rowOffset[i,j] = -1
colOffset[i,j] = 0
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i+1,j]).all():
rowOffset[i,j] = 1
colOffset[i,j] = 0
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i-1,j+1]).all():
rowOffset[i,j] = -1
colOffset[i,j] = 1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i,j]).all():
rowOffset[i,j] = 0
colOffset[i,j] = 1
elif (terrain[i-1:i+2,j-1:j+2]>=terrain[i+1,j+1]).all():
rowOffset[i,j] = 1
colOffset[i,j] = 1
else:
rowOffset[i,j] = 0
colOffset[i,j] = 0
return rowOffset, colOffset
运行需要很长时间,但它确实运行。我无法想象我实际上是在以最有效的方式做到这一点。任何输入?