我有一个表示cloud mask for GIS data的mxN数值数组的布尔数据.我想通过向所有方向移动n个单元格来扩展遮罩.这是一种简单的方法来go 除我蒙版中的云阴影(云像素旁边). 这些数字数组通常在cloud mask for GIS data0xcloud mask for GIS data0和cloud mask for GIS data00xcloud mask for GIS data00像素之间.
我的问题类似于这个one,但有2个维度.
我非常简单但效率低下的解决方案如下所示:
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
另一种解决方案是:
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 # or 1000, 10000...
a = np.random.random((N,N))
a = (a < 0.30)*1