Python 如何在numpy中使用搜索窗口并将最大值和所有其他值保留为零
我有一个二维数组(101行100列)。现在我想创建一个搜索窗口或块(3行x 3列),它将在数组中移动并确定最大值,选择它并使用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...
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