计算(x,y,z)点列表中最近邻居的(欧几里得)距离的最有效方法是什么?

问题描述 投票:1回答:1

对于数组中的每个点,最有效的方法是计算最近邻的距离(欧几里得)?

我有一个(X,Y,Z)点的列表,我想计算一个最近邻距离的列表。距离的索引将对应于该点的索引。

我调查了PYOD和sklearn邻居,但是这些邻居似乎需要“教学”。我认为我的问题比这简单。对于每个点:找到最近的邻居,计算距离。

示例数据:

points = [
     (0.003467119 ,0.01422762 ,0.0101960126),
     (0.007279433  ,0.01651597  ,0.0045558849),
     (0.005392258  ,0.02149997  ,0.0177409387),
     (0.017898802  ,0.02790659  ,0.0006487222),
     (0.013564214  ,0.01835688  ,0.0008102952),
     (0.013375397  ,0.02210725 ,0.0286032185)
]

计算k = 1最近的邻居距离

结果格式:

results = [(point, nearest neighbor distance), ...]

示例结果:

results = [
((0.003467119, 0.01422762, 0.0101960126), (0.007279433, 0.01651597, 0.0045558849)), 
((0.007279433, 0.01651597, 0.0045558849), (0.003467119, 0.01422762, 0.0101960126)), 
((0.005392258, 0.02149997, 0.0177409387), (0.003467119, 0.01422762, 0.0101960126)), 
((0.017898802, 0.02790659, 0.0006487222), (0.013564214, 0.01835688, 0.0008102952)), 
((0.013564214, 0.01835688, 0.0008102952), (0.007279433, 0.01651597, 0.0045558849)), 
((0.013375397, 0.02210725, 0.0286032185), (0.005392258, 0.02149997, 0.0177409387))
]
python knn nearest-neighbor euclidean-distance
1个回答
0
投票

怎么样?

from scipy.spatial import distance

A = (0.003467119 ,0.01422762 ,0.0101960126)
B = (0.007279433  ,0.01651597  ,0.0045558849)
C = (0.005392258  ,0.02149997  ,0.0177409387)
D = (0.017898802  ,0.02790659  ,0.0006487222)
E = (0.013564214  ,0.01835688  ,0.0008102952)
F = (0.013375397  ,0.02210725 ,0.0286032185)

points = [A, B, C, D, E, F]
results = []
for point in points:
    distances = [{'point':point, 'neighbor':p, 'd':distance.euclidean(point, p)} for p in points if p != point]
    results.append(min(distances, key=lambda k:k['d']))

结果将是对象列表,如下所示:

results = [
    {'point':(x1, y1, z1), 'neighbor':(x2, y2, z2), 'd':"distance from point to neighbor"},
...]

point是参考点,neighbor是该点的最近邻居。

© www.soinside.com 2019 - 2024. All rights reserved.