我有一个矩阵,如:
0001111111110
0010000000001
0100000000010
0100000000010
0010000000001
0011111111110
我希望它用以下内容填充内部零:
0001111111110
0011111111111
0111111111110
0111111111110
0011111111111
0011111111110
有很多矩阵,它们很大。
我现在只有一个想法:
for i, row in enumerate(mask):
if sum(row) > 0:
top_one = np.argmax(row)
bot_one = len(row) - np.argmax(row[::-1]) - 1
mask[i, top_one:bot_one] = 1
只能有一个内部零区!(简单案例)
我想要最有效和最美丽的解决方案,
编辑:为什么scipy
方法不起作用?
a = np.array([[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0]])
scipy.ndimage.binary_fill_holes(a).astype(int)
array([[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0]])
答案 0 :(得分:2)
scipy.ndimage中有一个函数可以做到这一点:
scipy.ndimage.binary_fill_holes(mask).astype(int)
结果
array([[0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]])