擅长:python、mysql、java
<p>您可以使用的最快选项可能是<a href="https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.distance.cdist.html" rel="nofollow noreferrer">^{<cd1>}</a>,它可以查找其输入中所有点之间的成对距离。虽然查找所有这些距离可能不是查找最近邻居的最快算法,但是<code>cdist</code>是用C实现的,因此它可能比Python中的任何方法都运行得更快。在</p>
<pre><code>import scipy as sp
import scipy.spatial
from scipy.spatial.distance import cdist
points = sp.array(...)
distances = sp.spatial.distance.cdist(points)
# An element is not its own nearest neighbor
sp.fill_diagonal(distances, sp.inf)
# Find the index of each element's nearest neighbor
mins = distances.argmin(0)
# Extract the nearest neighbors from the data by row indexing
nearest_neighbors = points[mins, :]
# Put the arrays in the specified shape
results = np.stack((points, nearest_neighbors), 1)
</code></pre>
<p>理论上你可以让它运行得更快(主要是通过将所有的步骤合并到一个算法中),但是除非你用C编写,否则你将无法与SciPy/NumPy竞争。在</p>
<p>(<code>cdist</code>在Θ(n<sup>2</sup>)时间内运行(如果每个点的大小是固定的),并且算法的每个其他部分都在O(n)时间内运行,因此即使您尝试在Python中优化代码,您也不会注意到少量数据的变化,并且对于更多的数据,<code>cdist</code>的改进也会黯然失色。)</p>