擅长:python、mysql、java
<p>您可以使用<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html" rel="nofollow noreferrer">^{<cd1>}</a>,它对于这种距离计算是非常有效的,比如-</p>
<pre><code>from scipy.spatial.distance import cdist
N = (cdist(A,B,'sqeuclidean') <= dSquared).astype(int)
</code></pre>
<hr/>
<p>正如<a href="https://stackoverflow.com/a/36629353/3293881">^{<cd2>}</a>中所建议的那样,也可以使用<code>broadcasting</code>。现在,从问题中发布的代码来看,我们处理的是<code>Nx2</code>形状的数组。因此,我们基本上可以对第一列和第二列进行切片,并分别对它们执行广播减法。这样做的好处是,我们不会继续使用<code>3D</code>,因此可以保持它的内存效率,这也可以转化为性能提升。因此,平方欧几里德距离的计算如下-</p>
^{pr2}$
<p>让我们来计算欧几里德距离平方的这三种方法。在</p>
<p>运行时测试-</p>
<pre><code>In [75]: # Input arrays
...: A = np.random.rand(200,2)
...: B = np.random.rand(200,2)
...:
In [76]: %timeit ((A[:,None,:] - B[None,:,:])**2).sum(axis=-1) # @hpaulj's solution
1000 loops, best of 3: 1.9 ms per loop
In [77]: %timeit (A[:,None,0] - B[:,0])**2 + (A[:,None,1] - B[:,1])**2
1000 loops, best of 3: 401 µs per loop
In [78]: %timeit cdist(A,B,'sqeuclidean')
1000 loops, best of 3: 249 µs per loop
</code></pre>