方法1:我們可以使用SciPy's 2D
convolution獲得求和滑動形狀(n,n)
的窗戶和argmax
選擇具有最大總和窗口的指數和轉化爲行,列指數以np.unravel_index
,像這樣 -
from scipy.signal import convolve2d as conv2
def largest_sum_pos_app1(a, n):
idx = conv2(a, np.ones((n,n),dtype=int),'same').argmax()
return np.unravel_index(idx, a.shape)
採樣運行 -
In [558]: a
Out[558]:
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
In [559]: largest_sum_pos_app1(a, n=3)
Out[559]: (2, 2)
方法#1S(超級充電):我們可以通過使用uniform filter
,像這樣進一步推動它 -
from scipy.ndimage.filters import uniform_filter as unif2D
def largest_sum_pos_app1_mod1(a, n):
idx = unif2D(a.astype(float),size=n, mode='constant').argmax()
return np.unravel_index(idx, a.shape)
方法2:另一個基於scikit-image
的滑動窗口創建工具view_as_windows
,我們將創建滑動形狀(n,n)
的窗戶給我們4D
數組,最後兩個形狀爲(n,n)
的軸對應於搜索窗口大小。因此,我們將沿着這兩個軸進行求和,並獲得argmax
索引並將其轉換爲實際的行,列的位置。
因此,實現起來 -
from skimage.util.shape import view_as_windows
def largest_sum_pos_app2(a, n):
h = (n-1)//2 # half window size
idx = view_as_windows(a, (n,n)).sum((-2,-1)).argmax()
return tuple(np.array(np.unravel_index(idx, np.array(a.shape)-n+1))+h)
也如在評論中提到,有一個甚至n
搜索方是令人困惑的因爲它不會有它的任何元素的中心座標。
運行測試
In [741]: np.random.seed(0)
In [742]: a = np.random.randint(0,1000,(1000,1000))
In [743]: largest_sum_pos_app1(a, n= 5)
Out[743]: (966, 403)
In [744]: largest_sum_pos_app1_mod1(a, n= 5)
Out[744]: (966, 403)
In [745]: largest_sum_pos_app2(a, n= 5)
Out[745]: (966, 403)
In [746]: %timeit largest_sum_pos_app1(a, n= 5)
...: %timeit largest_sum_pos_app1_mod1(a, n= 5)
...: %timeit largest_sum_pos_app2(a, n= 5)
...:
10 loops, best of 3: 57.6 ms per loop
100 loops, best of 3: 10.1 ms per loop
10 loops, best of 3: 47.7 ms per loop
如果'N'是'4',就不會有'2'問題:沒有中心'index'並在'example',所有卷積會有相同的'總和'...不是嗎? –