擅长:python、mysql、java
<p>我认为可以使用numpy和scipy优化您想要做的事情:</p>
<pre><code>import numpy as np
import scipy.spatial.distance as distance
import matplotlib.pyplot as plt
points = np.random.random((6,2))
dists =distance.pdist(points)
m=np.argsort(distance.squareform(dists))[:,1:]
order = [0,m[0,0]]
next_point = order[-1]
while len(order)<len(points):
row = m[next_point]
i = 0
while row[i] in order:
i += 1
order.append(row[i])
next_point = order[-1]
order.append(0)
ordered=points[order]
plt.plot(ordered[:,0], ordered[:,1], 'o-')
</code></pre>
<p>这段代码的基本思想如下。首先计算所有的距离。然后使用<code>argsort</code>获得将对每一行进行排序的索引。可以删除第一列,因为每个点都最接近自身。我们知道。然后你看看哪个是下一个最近的点,如果这个点还没有出现,你就把它添加到列表中。然后转到与此点对应的行,并查找下一个点。等等。你知道吗</p>
<p>如果您只感兴趣的是对封闭的点集进行排序,则可以使用<a href="https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.spatial.ConvexHull.html" rel="nofollow noreferrer">^{<cd3>}</a>查找它们:</p>
<pre><code>ch = ConvexHull(points)
plt.plot(points[ch.vertices,0], points[ch.vertices,1], 'o-')
</code></pre>