问题描述
我有一个N=3
点的列表,作为输入:
points = [[1,1],[2,2],[4,4]]
我编写了这段代码来计算列表points
中所有元素之间所有可能的距离,如dist = min(∣x1−x2∣,∣y1−y2∣)
:
distances = []
for i in range(N-1):
for j in range(i+1,N):
dist = min((abs(points[i][0]-points[j][0]),abs(points[i][1]-points[j][1])))
distances.append(dist)
print(distances)
我的输出将是数组distances
,其中保存了所有距离:[1,3,2]
它可以与N=3
一起正常工作,但是我想以更有效的方式进行计算,并且可以自由设置N=10^5
。
我也尝试使用numpy
和scipy
,但是在替换循环和使用正确的方法时遇到了一些麻烦。
有人可以帮我吗?预先感谢
解决方法
numpythonic 解决方案
要使用 Numpy 的全部功能来计算距离,并进行计算 快得多:
-
将您的点转换为 Numpy 数组:
pts = np.array(points)
-
然后运行:
dist = np.abs(pts[np.newaxis,:,:] - pts[:,np.newaxis,:]).min(axis=2)
这里的结果是一个正方形数组。 但是,如果您想获得对角线上方的元素的列表, 就像您的代码生成一样,您可以运行:
dist2 = dist[np.triu_indices(pts.shape[0],1)].tolist()
我为以下 9 点运行了这段代码:
points = [[1,1],[2,2],[4,4],[3,5],8],10],7],9],7]]
对于上述数据,保存在 dist (完整数组)中的结果为:
array([[0,1,3,2,3],[1,0],0]])
,对角线上方的元素列表为:
[1,2]
我的代码有多快
事实证明,即使对于像我这样使用的小样本( 9 点),我的代码的运行速度快2倍。对于18点样本 (此处未显示)-快 6 倍。
即使我的功能已经获得了这种速度差异 计算出“比需要多2倍”,即生成一个完整 数组,而结果的较低对角线部分为“镜像 视图”(对您的代码进行计算)。
对于更大数量的点,差异应该更大。 对更大的分数样本(例如100分数)进行测试,并写出如何 我的代码快了很多倍。