找到2d numpy数组中最大总和的位置

时间:2017-10-28 18:53:59

标签: python arrays numpy area

所以我想说我有一个类似于这个的数组:

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

我想返回某个n * n平方内最大值之和的中心位置。所以在这种情况下,如果n = 3,它将是(2,2)。如果我让n = 4,那将是相同的结果。

numpy有找到这个位置的方法吗?

1 个答案:

答案 0 :(得分:1)

方法#1:我们可以使用SciPy's 2D convolution在形状(n,n)的滑动窗口中获取摘要,并选择最大总和为{{1的窗口的索引并转换为行,col索引与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)

方法#1S(超级收费):我们可以使用uniform filter进一步提升它,就像这样 -

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)

方法#2:另一个基于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) 的滑动窗口创建工具view_as_windows,我们将创建形状为scikit-image的滑动窗口,以便为我们提供(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