2016-03-30 9 views
1

Iは、配列(N、M)を有するに係る2次元配列内の値を置き換えますは隣接値

[255 100 255] 
[100 255 100] 
[255 100 255] 

私はneigboring値はならノース、イーストをテストされるような新しいアレイを作成する必要があり、 nと、1:

[255 100 255] 
[100 100 100] 
[255 100 255] 

が、私は簡単な1でループのソリューションを持っている:Mが、それは明らかに非常に遅いですし、そこにある場合、私は疑問に思って、南、西は私の値が100に設定されている100に全て等しいですそれをもっと速くする方法。 平均を計算するためにスライディングウィンドウについて話しているリンクがいくつか見つかりましたが、新しい配列を作成するためにインデックスをどのように追跡できるか分かりません。 Using strides for an efficient moving average filter

ご入力いただきありがとうございます。

答えて

1

ここslicingboolean indexingを用いて一つのアプローチだ、入力配列としてAを仮定 -

# Get west, north, east & south elements for [1:-1,1:-1] region of input array 
W = A[1:-1,:-2] 
N = A[:-2,1:-1] 
E = A[1:-1,2:] 
S = A[2:,1:-1] 

# Check if all four arrays have 100 for that same element in that region 
mask = (W == 100) & (N == 100) & (E == 100) & (S == 100) 

# Use the mask to set corresponding elements in a copy version as 100s 
out = A.copy() 
out[1:-1,1:-1][mask] = 100 

サンプルラン -


このような問題は大部分の信号処理/画像に見られる

In [90]: A 
Out[90]: 
array([[220, 93, 205, 82, 23, 210, 22], 
     [133, 228, 100, 27, 210, 186, 246], 
     [196, 100, 73, 100, 86, 100, 53], 
     [195, 131, 100, 142, 100, 214, 100], 
     [247, 73, 117, 116, 24, 100, 50]]) 

In [91]: W = A[1:-1,:-2] 
    ...: N = A[:-2,1:-1] 
    ...: E = A[1:-1,2:] 
    ...: S = A[2:,1:-1] 
    ...: mask = (W == 100) & (N == 100) & (E == 100) & (S == 100) 
    ...: 
    ...: out = A.copy() 
    ...: out[1:-1,1:-1][mask] = 100 
    ...: 

In [92]: out 
Out[92]: 
array([[220, 93, 205, 82, 23, 210, 22], 
     [133, 228, 100, 27, 210, 186, 246], 
     [196, 100, 100, 100, 86, 100, 53], 
     [195, 131, 100, 142, 100, 100, 100], 
     [247, 73, 117, 116, 24, 100, 50]]) 
処理ドメイン。

from scipy import signal 
from scipy import ndimage 

# Use a structuring elements with north, west, east and south elements as 1s 
strel = ndimage.generate_binary_structure(2, 1) 

# 2D Convolve to get 4s at places that are surrounded by 1s 
mask = signal.convolve2d((A==100).astype(int),strel,'same')==4 

# Use the mask to set corresponding elements in a copy version as 100 
out = A.copy() 
out[mask] = 100 

サンプル実行 - -

In [119]: A 
Out[119]: 
array([[108, 184, 0, 176, 131, 86, 201], 
     [ 22, 47, 100, 78, 151, 196, 221], 
     [185, 100, 142, 100, 121, 100, 24], 
     [201, 101, 100, 138, 100, 20, 100], 
     [127, 227, 217, 19, 206, 100, 43]]) 

In [120]: strel = ndimage.generate_binary_structure(2, 1) 
    ...: mask = signal.convolve2d((A==100).astype(int),strel,'same')==4 
    ...: 
    ...: out = A.copy() 
    ...: out[mask] = 100 
    ...: 

In [121]: out 
Out[121]: 
array([[108, 184, 0, 176, 131, 86, 201], 
     [ 22, 47, 100, 78, 151, 196, 221], 
     [185, 100, 100, 100, 121, 100, 24], 
     [201, 101, 100, 138, 100, 100, 100], 
     [127, 227, 217, 19, 206, 100, 43]]) 

よりストレートなアプローチは、正確に意図する動作である、ndimage.binary_closingとなりますので、あなたはそうのように、代替ソリューションのためにあまりにも2D convolutionを使用することができますclosingこちら。だから、マスクを手に入れる別の方法は、

strel = ndimage.generate_binary_structure(2, 1) 
mask = ndimage.binary_closing(A==100, structure=strel) 
+0

です。ありがとうございました。私は参考のために別の関連記事をリンクしています。 http://stackoverflow.com/questions/32357087/replace-values-in-specific-columns-of-a-numpy-array?rq=1 –

関連する問題