2014-10-10 50 views
3

給定:R是m×n個浮點數矩陣蟒:更快局部最大值在2-d矩陣

輸出:O是m×n矩陣,其中-O [I,J]如果(ⅰ= R [I,J], j)是局部最大值,否則O [i,j] = 0。局部最大值定義爲以i,j爲中心的3x3塊中的最大元素。

什麼是使用numpy和scipy在python上執行此操作的更快方法。

m,n = R.shape 
for i in range(m): 
    for j in range(n): 
     R[i,j] *= (1 if R[min(0,i-1):max(m, i+2), min(0,j-1):max(n,j+2)].max() == R[i,j] else 0) 

回答

9

您可以使用scipy.ndimage.maximum_filter

In [28]: from scipy.ndimage import maximum_filter 

下面是一個示例R

In [29]: R 
Out[29]: 
array([[3, 3, 0, 0, 3], 
     [0, 0, 2, 1, 3], 
     [0, 1, 1, 1, 2], 
     [3, 2, 1, 2, 0], 
     [2, 2, 1, 2, 1]]) 

得到最大的3×3的窗口:

In [30]: mx = maximum_filter(R, size=3) 

In [31]: mx 
Out[31]: 
array([[3, 3, 3, 3, 3], 
     [3, 3, 3, 3, 3], 
     [3, 3, 2, 3, 3], 
     [3, 3, 2, 2, 2], 
     [3, 3, 2, 2, 2]]) 

比較mxR;這是一個布爾矩陣:

In [32]: mx == R 
Out[32]: 
array([[ True, True, False, False, True], 
     [False, False, False, False, True], 
     [False, False, False, False, False], 
     [ True, False, False, True, False], 
     [False, False, False, True, False]], dtype=bool) 

使用np.where創建O

In [33]: O = np.where(mx == R, R, 0) 

In [34]: O 
Out[34]: 
array([[3, 3, 0, 0, 3], 
     [0, 0, 0, 0, 3], 
     [0, 0, 0, 0, 0], 
     [3, 0, 0, 2, 0], 
     [0, 0, 0, 2, 0]])