2016-03-30 19 views
1

Bir dizi (n, m) sahip uygun bir 2d dizideki değerleri yerine:komşu değerleri

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

I neigboring değerler ise kuzey, doğu test edilir böyle yeni bir dizi oluşturmak için gereken, n ve 1:

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

Ben basit bir on 1 döngüler çözüm: m ama açıkçası çok yavaş ve orada olup olmadığını merak ediyorum Güney, Batı benim değerini 100 olarak ayarlanır 100'e TÜM eşittir daha hızlı yapmanın yolu. Ortalama hesaplamak için sürgülü pencereden söz eden birkaç bağlantı buldum, ancak yeni diziyi oluşturmak için dizinlerimi nasıl takip edebileceğimi bilmiyorum. Using strides for an efficient moving average filter

Girişleriniz için şimdiden teşekkür ederiz.

cevap

1

burada slicing ve boolean indexing kullanılarak bir yaklaşım, giriş dizi olarak A varsayıldığında -

# 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 

Örnek çalıştırmak -


bu gibi sorunlar büyük ölçüde sinyal işleme/görüntüsünde görülür

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]]) 
işleme alanı. Yani, alternatif bir çözüm için çok 2D convolution kullanabilmesi gibi -

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 

Numune koşmak -

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

daha düz ileri yaklaşım tam olarak amaçlanan çalışma olan ndimage.binary_closing ile olur closing burada. Bu yüzden, maskeyi almanın başka bir alternatif yolu -

+0

Harika yanıt! Teşekkür ederim. Referans için başka bir ilgili gönderi bağlarım. http://stackoverflow.com/questions/32357087/replace-values-in-specific-columns-of-a-numpy-array?rq=1 –