<p>从<a href="https://stackoverflow.com/questions/45960192/using-numpy-as-strided-function-to-create-patches-tiles-rolling-or-sliding-w">previous answer</a>使用<code>window_nd</code></p>
<pre><code>def min_search(a, val = 2):
a_view = window_nd(np.pad(a, ((1, 1),(1, 1)), 'constant',
constant_values = np.inf), 3)
min_val = np.where(a_view[a == val] <= val, np.inf, a_view[a == val]).min()
neig_mask = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]], dtype = bool)
rev_mask = np.logical_and(np.any(np.logical_and(a_view == min_val,
neig_mask), axis = (-1, -2)), a == val)
min_mask = np.logical_and(np.any(np.logical_and(a_view == val,
neig_mask), axis = (-1, -2)), a == min_val)
return np.nonzero(min_mask), np.nonzero(rev_mask)
</code></pre>
<p>它的作用是:</p>
<ul>
<li>在填充有<code>val</code>的<code>a</code>上创建滑动窗口(因此窗口形状是<code>(*a.shape, 3, 3)</code>)</li>
<li>在中心有<code>val</code>的所有窗口中查找大于<code>val</code>的最小值(填充允许边的聚焦),并将其分配给<code>min_val</code></li>
<li><code>neig_mask</code>将相邻对象限制为基数方向</li>
<li>查找<code>min_val</code>位于<code>neig_mask</code>位置且<code>val</code>位于中心的窗口,分配给<code>rev_mask</code></li>
<li>查找<code>val</code>位于<code>neig_mask</code>位置且<code>min_val</code>位于中心的窗口,分配给<code>min_mask</code></li>
<li><p>返回<code>min_mask</code>和<code>rev_mask</code>中的<code>np.nonzero</code>,这些元组可以用作<code>a</code>上的索引</p>
<pre><code>min_search(a)
Out:
((array([0, 4], dtype=int32), array([2, 3], dtype=int32)),
(array([1, 3], dtype=int32), array([2, 3], dtype=int32)))
</code></pre></li>
</ul>