2017-01-29 158 views
0

我想填充满足某些属性(使用掩码可能)的numpy矩阵的一部分。即,它是一些形状的矩阵表示,例如,正方形是:使用NumPy填充形状/轮廓

square = [0,0,0,0,0; 
     0,1,1,1,0; 
     0,1,0,1,0; 
     0,1,1,1,0] 

变为:

s_filled = [0,0,0,0,0; 
     0,1,1,1,0; 
     0,1,1,1,0; 
     0,1,1,1,0] 

和圆:

circle = [0,0,0,0,0,0; 
      0,0,1,1,0,0; 
      0,1,0,0,1,0; 
      0,0,1,1,0,0] 

和变成:

c_filled = [0,0,0,0,0,0; 
      0,0,1,1,0,0; 
      0,1,1,1,1,0; 
      0,0,1,1,0,0] 

这可能与usi只有numpy和没有其他外部库? 我想将这个函数/算法应用到300x300形状。

非常感谢!

+0

为你所做的发布解决方案的工作? – Divakar

+0

感谢您的回答,但不抱歉。我需要更通用的解决方案。这只会在你需要用1s填充你的内部形状而外部部分全是0时(而不是其他方式)。 –

回答

1

很简单,np.maximum.accumulate,因为我们可以沿着从左到右的行使用它一次,然后从右到左,并简单地通过减法获得非零的公共区域。这可以很好地用于凸形状。

因此,实现将是 -

def fill_contours(arr): 
    return np.maximum.accumulate(arr,1) & \ 
      np.maximum.accumulate(arr[:,::-1],1)[:,::-1] 

这里有将任意形状的样品运行 -

In [176]: arbitrary 
Out[176]: 
array([[0, 0, 1, 0, 0, 0, 0], 
     [0, 1, 0, 1, 0, 0, 0], 
     [1, 0, 0, 0, 1, 0, 0], 
     [0, 1, 0, 0, 1, 0, 0], 
     [0, 1, 0, 0, 1, 0, 0], 
     [0, 0, 1, 0, 0, 1, 0], 
     [0, 1, 0, 0, 1, 0, 0], 
     [0, 1, 1, 1, 0, 0, 0]]) 

In [177]: fill_contours(arbitrary) 
Out[177]: 
array([[0, 0, 1, 0, 0, 0, 0], 
     [0, 1, 1, 1, 0, 0, 0], 
     [1, 1, 1, 1, 1, 0, 0], 
     [0, 1, 1, 1, 1, 0, 0], 
     [0, 1, 1, 1, 1, 0, 0], 
     [0, 0, 1, 1, 1, 1, 0], 
     [0, 1, 1, 1, 1, 0, 0], 
     [0, 1, 1, 1, 0, 0, 0]])