我有一个来自 .tif LiDAR 表面的高程数组。下面的示例数组。
Existing_example_arrayV0 = [[ 0, 0, 1, 0, 0, 0, 0],
[ 0, 1, 1, 1, 0, 0, 0],
[ 0, 1, 1, 1, 1, 0, 0],
[ 1, 1, 1, 1, 1, 0, 0],
[ 0, 1, 1, 1, 1, 0, 0],
[ 0, 1, 1, 0, 0, 0, 0]]
我正在尝试使用 scipy.ndimage 迭代数组并向数组添加 100。
Existing_example_arrayV0[binary_erosion(Existing_example_arrayV0 >=1, structure=[[1,1,1]])] += 100
产生第一次迭代。
Existing_example_arrayV1 = [[ 0, 0, 1, 0, 0, 0, 0],
[ 0, 1, 100, 1, 0, 0, 0],
[ 0, 1, 100, 100, 1, 0, 0],
[ 1, 100, 100, 100, 1, 0, 0],
[ 0, 1, 100, 100, 1, 0, 0],
[ 0, 1, 1, 0, 0, 0, 0]]
我不熟悉二值侵 eclipse ,因此我很难迭代创建第二次迭代:
Existing_example_arrayV2 = [[ 0, 0, 1, 0, 0, 0, 0],
[ 0, 1, 100, 1, 0, 0, 0],
[ 0, 1, 100, 100, 1, 0, 0],
[ 1, 100, 200, 100, 1, 0, 0],
[ 0, 1, 100, 100, 1, 0, 0],
[ 0, 1, 1, 0, 0, 0, 0]]
我尝试创建一个 for
循环来创建下一步,但在使其正确运行时遇到问题。
import scipy.ndimage as binary_erosion
for i in range(0,1):
binary_erosion(Existing_example_arrayV1>=1, structure=[[1,1,1]], iterations = i + 1)
我认为该范围只会运行下一次迭代来生成 Existing_example_arrayV2
,但事实并非如此。
我试图在完成的 numpy 数组(V0 -> V1、V1 -> V2 等)之上添加一个迭代,以继续循环,无论我需要运行多少次迭代。
最佳答案
对我来说,这段代码执行您所描述的操作:
example_V2 = example_V0.copy()
for i in range(1, 3):
mask = binary_erosion(example_V0, iterations=i)
example_V2[mask] += 100
每次迭代,它都会向下一层添加 100。
但是您的示例步骤似乎您不想为第一步添加 100,而是添加 99。在这种情况下,您可以在末尾添加一行:
example_V2[binary_erosion(example_V2)] -= 1
如果您想要执行一个产生第 n 次迭代的完整函数:
def elevation_array(flat_array, n):
out = flat_array.copy()
for i in range(1, n+1):
mask = binary_erosion(flat_array, iterations=i)
out[mask] += 100
if n > 0:
out[binary_erosion(out)] -= 1
return out
关于python - 使用 Scipy.ndimage 迭代高程数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76460209/