You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高效扩展二维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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:10:36