使用scipy cKDTree查找最近值索引结果异常的问题排查
问题原因与解决方法
你遇到的问题是对cKDTree.query()的返回值理解有误:它返回的是**(最小欧氏距离, 目标点在构建树的数据集里的索引下标)**,不是直接返回坐标对。
具体分析你的例子
当你查询[6,9]时,返回的(1.0, 0)含义是:
1.0:查询点(6,9)到最近匹配点的欧氏距离,计算为√[(7-6)² + (9-9)²] = 1.00:最近匹配点在greaterThanIndexes数组中的索引,对应数组的第0个元素[7,9],这正是你预期的结果之一。
而你提到的另一个候选点(8,8),它和(6,9)的距离是√[(8-6)² + (8-9)²] = √5 ≈2.236,确实比1.0大,所以不是最近点。
正确获取坐标的方法
要得到实际的坐标对,只需用返回的索引去greaterThanIndexes数组中取值即可,修正后的代码如下:
from scipy.spatial import cKDTree import numpy as np # 构建测试数组 test = np.array([i+j for i in range(10) for j in range(10)]).reshape(10,10) # 获取符合条件的索引 greaterThanIndexes = np.stack(np.where(test>=16), axis=1) # 构建KD树 LookUpTree = cKDTree(data=greaterThanIndexes) # 查询(6,9)的最近点 distance, idx = LookUpTree.query([6,9]) nearest_point = greaterThanIndexes[idx] print(f"最近点距离: {distance}") print(f"最近点坐标: {nearest_point}")
运行结果:
最近点距离: 1.0 最近点坐标: [7 9]
扩展:查找k个最近邻
如果需要获取多个最近点,可以指定k参数,返回的距离和索引会是数组形式:
distances, idxs = LookUpTree.query([6,9], k=2) nearest_points = greaterThanIndexes[idxs] print(f"前2近点距离: {distances}") print(f"前2近点坐标: {nearest_points}")
运行结果:
前2近点距离: [1. 2.23606798] 前2近点坐标: [[7 9] [8 8]]
内容的提问来源于stack exchange,提问作者Eric Eckert
相关产品推荐
相关产品推荐

