假設A
作爲輸入陣列,這裏是使用slicing
和boolean indexing
一種方法 -
# 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]])
這樣的問題被認爲主要是在信號處理和/或圖像處理域。所以,你可以使用2D convolution
過一個替代的解決方案,像這樣 -
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
,這正是預期運行closing
這裏。所以,另一種替代方式獲得面具將是 -
strel = ndimage.generate_binary_structure(2, 1)
mask = ndimage.binary_closing(A==100, structure=strel)
很好的答案!謝謝。我鏈接了另一篇相關文章以供參考。 http://stackoverflow.com/questions/32357087/replace-values-in-specific-columns-of-a-numpy-array?rq=1 –