2016-06-13 21 views
1

私は0と1で塗りつぶされた2D numpy配列を持っています。それに1に隣接するすべての値が1に変換されるように変換したいと思います(したがって、タイトルの "汚染" 。例えばナンシー配列の値 "汚染"

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 1 0 0 
0 0 0 0 1 0 
0 0 1 0 0 0 
0 0 0 0 0 0 

になる:

import numpy as np 

ones = [] 

ar = np.array([[0,0,0,0,0,0], 
     [0,0,0,0,0,0], 
     [0,0,0,1,0,0], 
     [0,0,0,0,1,0], 
     [0,0,1,0,0,0], 
     [0,0,0,0,0,0]]) 

n_row, n_col = ar.shape 

for i in range(n_row): 
    for j in range(n_col): 

     if ar[i][j] == 1: 
      ones.append((i, j)) 

for x,y in ones: 
    # Replace neighboring values 

0 0 0 0 0 0 
0 0 1 1 1 0 
0 0 1 1 1 1 
0 1 1 1 1 1 
0 1 1 1 1 1 
0 1 1 1 0 0 

Iは、すべての値をループ1Sを発見し、その後隣接する値を置換することによって、これを達成することができ

しかし、これは過剰です(特に私は本当に大きな配列に対処する予定だからです)。

すべての値をループせずにこれを達成する方法はありますか?

答えて

2

これは基本的にはdilation operation in Image-processing domainです。サンプル実行

from scipy.ndimage import binary_dilation 
out = binary_dilation(arr, structure=np.ones((3,3))).astype(int) 

- -

In [21]: arr 
Out[21]: 
array([[0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 1, 0], 
     [0, 0, 1, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0]]) 

In [22]: binary_dilation(arr, structure=np.ones((3,3))).astype(int) 
Out[22]: 
array([[0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 1, 1, 0], 
     [0, 0, 1, 1, 1, 1], 
     [0, 1, 1, 1, 1, 1], 
     [0, 1, 1, 1, 1, 1], 
     [0, 1, 1, 1, 0, 0]]) 
+0

これはまさに私が探していたものです。ありがとう! – 3kt

0

あなたが説明した動作は、 "バイナリ拡張" として知られているので、あなたはScipy's binary dilationを使用することができます。 scipy.ndimageに実装されています。たとえば、

In [369]: a 
Out[369]: 
array([[0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 1, 0, 0], 
     [0, 0, 0, 0, 1, 0], 
     [0, 0, 1, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0]]) 

In [370]: from scipy.ndimage import binary_dilation 

In [371]: binary_dilation(a, structure=np.ones((3, 3))) 
Out[371]: 
array([[False, False, False, False, False, False], 
     [False, False, True, True, True, False], 
     [False, False, True, True, True, True], 
     [False, True, True, True, True, True], 
     [False, True, True, True, True, True], 
     [False, True, True, True, False, False]], dtype=bool) 

In [372]: binary_dilation(a, structure=np.ones((3, 3))).astype(int) 
Out[372]: 
array([[0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 1, 1, 0], 
     [0, 0, 1, 1, 1, 1], 
     [0, 1, 1, 1, 1, 1], 
     [0, 1, 1, 1, 1, 1], 
     [0, 1, 1, 1, 0, 0]]) 
関連する問題