高效扩展二维NumPy掩码:向所有方向扩展n个单元格
高效扩展二维NumPy云掩码的方案需求
我有一个MxN的布尔型NumPy数组,作为GIS数据的云掩码。需要将该掩码向所有方向扩展n个单元格,以此简单去除掩码中的云阴影(云像素周边区域)。这类NumPy数组的尺寸通常在1000×1000至10000×10000像素之间。
目前我有两种解决方案,但都存在不足:
方案1:双重循环实现(简单但低效)
def expand_for(arr, shiftx=1, shifty=1): arr_b = arr.copy().astype(bool) for i in range(arr.shape[0]): for j in range(arr.shape[1]): if(arr[i,j]): i_min, i_max = max(i-shifty, 0), min(i+shifty+1, arr.shape[0]) j_min, j_max = max(j-shiftx, 0), min(j+shiftx+1, arr.shape[1]) arr_b[i_min:i_max, j_min:j_max] = True return arr_b
方案2:数组平移实现(复杂度随扩展距离提升)
def shift_array(arr, x, y): d, u, r, l = max(y, 0), max(-y, 0), max(x, 0), max(-x, 0) ret = np.pad(arr, ((d, u), (r, l)), mode='constant') return ret[u or None: -d or None, l or None: -r or None] def expand_array(arr, shiftx=1, shifty=1): return np.dstack([shift_array(arr, x, y) for x in range(-shiftx, shiftx + 1) for y in range(-shifty, shifty + 1)]).any(axis=2)
效果示例
a = np.array([[0,0,0,0,0], [0,0,0,0,0], [0,0,1,0,0], [0,0,0,0,0], [0,0,0,0,0]]) expand_for(a, 1, 1) >>> array([[False, False, False, False, False], [False, True, True, True, False], [False, True, True, True, False], [False, True, True, True, False], [False, False, False, False, False]])
测试数据生成代码
N = 100 # 可替换为1000、10000等 a = np.random.random((N,N)) a = (a < 0.30)*1
现寻求高效的二维NumPy掩码扩展方案。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

