有效地改变特殊位置的矩阵元素

时间:2016-11-11 22:43:02

标签: python numpy

我有一个矩阵,如:

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]])

1 个答案:

答案 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]])