Python 如何在numpy中使用搜索窗口并将最大值和所有其他值保留为零

Python 如何在numpy中使用搜索窗口并将最大值和所有其他值保留为零,python,python-2.7,numpy,Python,Python 2.7,Numpy,我有一个二维数组(101行100列)。现在我想创建一个搜索窗口或块(3行x 3列),它将在数组中移动并确定最大值,选择它并使用python和numpy将所有其他值保留为零。比如说 x = ([[1,2,3,4,5,6,7,8,9,10], [2,5,4,5,3,4,6,7,5,3], [3,3,4,5,6,7,3,4,5,8]] 例如,从左上角开始使用2x2搜索窗口x.somefunction将给出结果 Result = ([0,0... [0,5...

我有一个二维数组(101行100列)。现在我想创建一个搜索窗口或块(3行x 3列),它将在数组中移动并确定最大值,选择它并使用python和numpy将所有其他值保留为零。比如说

x = ([[1,2,3,4,5,6,7,8,9,10],
     [2,5,4,5,3,4,6,7,5,3],
     [3,3,4,5,6,7,3,4,5,8]]
例如,从左上角开始使用2x2搜索窗口x.somefunction将给出结果

Result = ([0,0...
          [0,5... for the 1st iteration so the the whole result should look like this 


Result = ([[0,0,0,0,0,6,0,8,0,10],
           [0,5,0,5,0,0,0,0,0,0],
           [3,3,0,5,0,7,0,4,0,8]]
请注意,搜索窗口的最后一行必须从2x2数组更改为2x1,因为搜索窗口不重叠

非常感谢你的帮助。
提前感谢

这里有一种使用
skimage.util.view作为块的方法

>>> import numpy as np
>>> import skimage.util as su
>>> 
>>> def split_axis(N, n):
...     q, r = divmod(N, n)
...     left = ((np.s_[:q*n], n),) if q else ()
...     right = ((np.s_[q*n:], r),) if r else ()
...     return (*left, *right)
... 
>>> def block_max(x, block, inplace=False):
...     if not inplace:
...         x = x.copy()
...     xi, xj = x.shape
...     bi, bj = block
...     for ci, ri in split_axis(xi, bi):
...         for cj, rj in split_axis(xj, bj):
...             vab = su.view_as_blocks(x[ci, cj], (ri, rj))
...             vab[vab < vab.max(axis=(-1, -2), keepdims=True)] = 0
...     return x
... 
>>> x = ([[1,2,3,4,5,6,7,8,9,10],
...      [2,5,4,5,3,4,6,7,5,3],
...      [3,3,4,5,6,7,3,4,5,8]])
>>> 
>>> x = np.array(x)
>>> 
>>> block_max(x, (2, 2))
array([[ 0,  0,  0,  0,  0,  6,  0,  8,  0, 10],
       [ 0,  5,  0,  5,  0,  0,  0,  0,  0,  0],
       [ 3,  3,  0,  5,  0,  7,  0,  4,  0,  8]])
您的更新问题(未经测试):


非常感谢。没有撇渣,我想我必须安装该软件包。只是一个简单的问题。如何修改代码以在搜索窗口中选择最大值和最小值。如果差异是,例如使用上面的数组x,则假设为2。将最大值返回为1,最小值返回为2。。将所有其他值设置为0。如果条件不匹配,则返回空数组(将所有值返回为零)
>>> def view_as_blocks(x, blockshape):
...     *xs, xi, xj = x.shape
...     bi, bj = blockshape
...     return np.ascontiguousarray(x).reshape(*xs, xi//bi, xj//bj, *blockshape)
>>> def block_max(x, block):
...     out = np.zeros_like(x)
...     xi, xj = x.shape
...     bi, bj = block
...     for ci, ri in split_axis(xi, bi):
...         for cj, rj in split_axis(xj, bj):
...             vab = su.view_as_blocks(x[ci, cj], (ri, rj))
...             oab = su.view_as_blocks(out[ci, cj], (ri, rj))
...             vmx = vab.max(axis=(-1, -2), keepdims=True)
...             vmn = vab.min(axis=(-1, -2), keepdims=True)
...             cond = vmx - vmn > 2
...             oab[cond & (vab == vmx)] == 1
...             oab[cond & (vab == vmn)] == 2
...     return out