<p>首先,您可以编写一个函数来计算表示为numpy数组的两点之间的欧几里德距离:</p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
distance = lambda p1, p2: np.sqrt(np.sum((p1 - p2) ** 2, axis=0))
</code></pre>
<p>我想不出比天真的O(n²)更好的方法来找到最小距离:</p>
<pre class="lang-py prettyprint-override"><code>import itertools
def min_distance(cloud):
pairs = itertools.combinations(cloud, 2)
return np.min(map(lambda pair: distance(*pair), pairs))
</code></pre>
<p>最后,您只需要从您的文件中获取点,我假设它如下所示:</p>
<p><em>cloud.csv</em></p>
<pre><code>x, y, z
1.2, 3.4, 2.55
2.77, 7.34, 23.4
5.66, 64.3, 4.33
</code></pre>
<pre class="lang-py prettyprint-override"><code>def get_points(filename):
with open(filename, 'r') as file:
rows = np.genfromtxt(file, delimiter=',', skip_header=True)
return rows
</code></pre>
<h2>最终代码</h2>
<pre class="lang-py prettyprint-override"><code>import itertools
import numpy as np
distance = lambda p1, p2: np.sqrt(np.sum((p1 - p2) ** 2, axis=0))
def min_distance(cloud):
pairs = itertools.combinations(cloud, 2)
return np.min(map(lambda pair: distance(*pair), pairs))
def get_points(filename):
with open(filename, 'r') as file:
rows = np.genfromtxt(file, delimiter=',', skip_header=True)
return rows
filename = 'cloud.csv'
cloud = get_points(filename)
min_dist = min_distance(cloud)
print(min_dist)
</code></pre>
<p><strong>输出</strong></p>
<pre><code>21.277006368378046
</code></pre>
<h2>编辑</h2>
<p>正如<a href="https://stackoverflow.com/users/8722421/amiga500">Amiga500</a>所指出的,可以使用<code>scipy.spatial.distance</code>。然后我们可以将<code>min_distance</code>重写如下:</p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
from scipy.spatial.distance import pdist
min_distance = lambda cloud: np.min(pdist(cloud))
</code></pre>