对于数组中的每个点,最有效的方法是计算最近邻的距离(欧几里得)?
我有一个(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))
]
怎么样?
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
是该点的最近邻居。