<p><strong>方法1</strong></p>
<p>我们可以得到欧几里德距离,看看是否有任何距离在<code>sqrt(2)</code>之内,它将用<code>distance = 1</code>覆盖{<cd2>},用{<cd4>}对角。这将给我们一个掩码,当索引到组坐标数组中时,它将给我们从中连接的那些。在</p>
<p>因此,使用<a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html" rel="nofollow noreferrer">^{<cd5>}</a>来获得这些欧几里德距离的实现是-</p>
<pre><code>from scipy.spatial.distance import cdist
out = groupCoords[(cdist(groupCoords,Arr)<1.5).any(1)]
</code></pre>
<p>样本运行-</p>
^{pr2}$
<hr/>
<p><strong>方法2</strong></p>
<p>另一种方法是检查两个数组的第一列和第二列之间的绝对元素差异。最后,从这两个掩模中得到一个联合遮罩,并检查任何匹配,并再次索引到组数组中以获得过滤后的坐标。在</p>
<p>因此,这种方法的实施将是-</p>
<pre><code>col0_mask = (np.abs(groupCoords[:,0,None] - Arr[:,0])<=1)
col1_mask = (np.abs(groupCoords[:,1,None] - Arr[:,1])<=1)
out = groupCoords[(col0_mask & col1_mask).any(1)]
</code></pre>
<hr/>
<p><strong>方法3</strong></p>
<p>另一种方法,如果将<code>Arr</code>作为布尔数组而不是2列坐标数组,则可能会更好。我们的想法是<code>Arr</code>的<a href="https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.ndimage.morphology.binary_dilation.html" rel="nofollow noreferrer">^{<cd7>}</a>,然后看看{<cd9>}的哪个坐标也在这个放大的图像中。对于扩展,我们将使用所有一的<code>3 x 3</code>核来覆盖所有这些邻域位置。为了检测这些公共点,我们需要用这些<code>groupCoords</code>绘制一幅图像。在</p>
<p>因此,准则将是-</p>
<pre><code>from scipy.ndimage.morphology import binary_dilation
img = np.zeros(Arr.shape,dtype=bool)
img[groupCoords[:,0],groupCoords[:,1]] = 1
out = np.argwhere(binary_dilation(Arr,np.ones((3,3))) & img)
</code></pre>
<p>样本运行-</p>
<pre><code>In [444]: # Inputs : groupCoords and let's create a sample array for Arr
...: groupCoords = np.array([[2,3],[5,6],[6,2],[5,3],[5,8]])
...:
...: Arr_Coords = np.array([[5,4],[11,12],[5,3],[1,3],[15,8],[55,21]])
...: Arr = np.zeros(Arr_Coords.max(0)+1,dtype=bool)
...: Arr[Arr_Coords[:,0], Arr_Coords[:,1]] = 1
...:
In [445]: img = np.zeros(Arr.shape,dtype=bool)
...: img[groupCoords[:,0],groupCoords[:,1]] = 1
...: out = np.argwhere(binary_dilation(Arr,np.ones((3,3))) & img)
...:
In [446]: out
Out[446]:
array([[2, 3],
[5, 3],
[6, 2]])
</code></pre>