<p>下面是如何使用cKDTree模块来实现这一点。见<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.cKDTree.query_pairs.html#scipy.spatial.cKDTree.query_pairs" rel="nofollow">query_pairs</a></p>
<pre><code>import numpy as np
from scipy.spatial.distance import cdist
from scipy.spatial import ckdtree
def close_pairs(X,max_d):
d = cdist(X,X)
I,J = (d<max_d).nonzero()
IJ = np.sort(np.vstack((I,J)), axis=0)
# remove diagonal element
IJ = IJ[:,np.diff(IJ,axis=0).ravel()<>0]
# remove duplicate
dt = np.dtype([('i',int),('j',int)])
pairs = np.unique(IJ.T.view(dtype=dt)).view(int).reshape(-1,2)
return pairs
def close_pairs_ckdtree(X, max_d):
tree = ckdtree.cKDTree(X)
pairs = tree.query_pairs(max_d)
return np.array(list(pairs))
def test():
np.random.seed(0)
X = np.random.rand(100,2)*20
p = close_pairs(X,2)
q = close_pairs_ckdtree(X, 2)
from matplotlib import pyplot as plt
plt.plot(X[:,0],X[:,1],'.r')
plt.plot(X[p,0].T,X[p,1].T,'-b')
plt.figure()
plt.plot(X[:,0],X[:,1],'.r')
plt.plot(X[q,0].T,X[q,1].T,'-b')
plt.show()
t
</code></pre>