为numpy Ndaray的移动子阵列查找最大值及其索引的pythonic方法是什么?

为numpy Ndaray的移动子阵列查找最大值及其索引的pythonic方法是什么?,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我有3维或4维的numpy Ndarray。我想在移动的子数组窗口中以指定的步长找到最大值及其索引 例如,假设我有一个4x4 2d阵列,为了简单起见,我的移动子阵列窗口为2x2,步幅为2: [[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9,10,11,12], [13,14,15,16]]. 我想找到 [[ 6 8], [14 16]] 对于最大值和 [(1,1), (3,1), (3,1), (3,3)] 以指数作为输出 是否有一种简洁、高效的实现方

我有3维或4维的numpy Ndarray。我想在移动的子数组窗口中以指定的步长找到最大值及其索引

例如,假设我有一个4x4 2d阵列,为了简单起见,我的移动子阵列窗口为2x2,步幅为2:

[[ 1, 2, 3, 4], 
 [ 5, 6, 7, 8], 
 [ 9,10,11,12], 
 [13,14,15,16]].
我想找到

[[ 6  8],
 [14 16]]
对于最大值和

[(1,1), (3,1),
 (3,1), (3,3)]
以指数作为输出


是否有一种简洁、高效的实现方法可以在不使用循环的情况下实现此for ndarray?

这里有一个使用
stride\u技巧的解决方案

def make_panes(arr, window):
    arr = np.asarray(arr)
    r,c = arr.shape
    s_r, s_c = arr.strides
    w_r, w_c = window

    if c % w_c != 0 or r % w_r != 0:
        raise ValueError("Window doesn't fit array.")

    shape = (r / w_r, c / w_c, w_r, w_c)
    strides = (w_r*s_r, w_c*s_c, s_r, s_c)

    return np.lib.stride_tricks.as_strided(arr, shape, strides)

def max_in_panes(arr, window):
    w_r, w_c = window
    r, c = arr.shape
    panes = make_panes(arr, window)
    v = panes.reshape((-1, w_r * w_c))

    ix = np.argmax(v, axis=1)
    max_vals = v[np.arange(r/w_r * c/w_c), ix]

    i = np.repeat(np.arange(0,r,w_r), c/w_c)
    j = np.tile(np.arange(0, c, w_c), r/w_r)
    rel_i, rel_j = np.unravel_index(ix, window)
    max_ix = i + rel_i, j + rel_j

    return max_vals, max_ix
演示:

>>> vals, ix = max_in_panes(x, (2,2))
>>> print vals
[[ 6  8]
 [14 16]]
>>> print ix
(array([1, 1, 3, 3]), array([1, 3, 1, 3]))

请注意,这是未经测试的,设计用于二维阵列。我将把n-d数组的泛化留给读者…

来自scikit的图片可能会很好。这使得查找最大值非常容易,但获取相应的索引将非常困难。还有一个问题,但同样的,问题是指数。这很有效!概括起来很简单。谢谢