2017-01-29 156 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]])