我正在尝试使用numpy蒙面数组来过滤光栅图像中的“无数据”。我正在做的数组计算减去相邻像素的值(见Applying functions to multidimensional numpy arrays without loops),但我需要忽略没有数据值。例如,使用数组:
array = np.array([[78, 72, 69, 71, 58, 49],
[74, 67, 56, 49, 46, 50],
[69, 53, 44, 37, -9999, -9999],
[64, 58, 55, 22, 33, 24],
[68, 61, 47, 21, 16, 19],
[74, 53, 34, 12, 11, 12]])
假设-9999是无数据值。所以我按如下方式掩盖了数组:
array = np.ma.masked_where(array == -9999, array, False)
这会产生预期的结果。然后我需要计算每个元素与周围8个邻居的差异。因此,对于“右下”邻居,这将是(忽略边缘像素):
result = array[1: 5, 1: 5] - array[2: 6, 2: 6]
这也产生我想要的结果:
[[23, 19, --, --],
[-2, 22, 4, --],
[11, 34, 6, 14],
[27, 35, 10, 4]]
但是,当我将结果数组作为空数组的维度插入时,掩码会从-9999丢失,更糟糕的是,“继承”掩码的元素([1,3]& [1,插入4])及其原始值。
gradient = np.empty((8, 4, 4), dtype = np.int)
gradient[0] = result
我可以再次屏蔽-9999值,但由于我将在梯度数组的轴0上应用argmax函数,原始值的保留会导致问题。我正在寻找一种方法来插入上面显示的结果数组,或者掩码的另一种方法是排除匹配空值的邻居元素和/或替换结果中的值。
答案 0 :(得分:2)
你应该使用nan(nan = not number)而不是-9999:
array[array == -9999] = np.nan
然后进行计算。从该值导出的每个值也应该是nan。