Scipy cdist计算向量间最大距离出错,求解决建议
问题分析与修正
你的代码存在两个关键问题:
- 多余的
np.max:u和v是单个向量,计算np.sqrt(((u-v)**2).sum())得到的是一个标量(两个向量的欧氏距离),对单个标量调用np.max不会改变结果,完全没必要添加这一层。 - 若目标是「最大坐标差距离(切比雪夫距离)」:你的计算逻辑完全错误。切比雪夫距离是两个向量对应元素差的绝对值的最大值,而非欧氏距离的max(欧氏距离本身就是标量)。
修正方案
情况1:计算欧氏距离(L2距离)
直接移除多余的np.max即可,或者更高效地使用Scipy内置的'euclidean'参数:
# 自定义lambda写法 dm = cdist(XA, XB, lambda u, v: np.sqrt(((u - v)**2).sum())) # 更高效的内置参数写法(推荐) dm = cdist(XA, XB, 'euclidean')
情况2:计算切比雪夫距离(最大坐标差,即你所说的「最大距离」)
需修改计算逻辑,取向量元素差的绝对值的最大值,同样有内置参数可用:
# 自定义lambda写法 dm = cdist(XA, XB, lambda u, v: np.max(np.abs(u - v))) # 更高效的内置参数写法(推荐) dm = cdist(XA, XB, 'chebyshev')
额外提示
Scipy的cdist内置了多种常用距离度量(如曼哈顿、闵可夫斯基等),使用内置参数比自定义lambda函数效率更高,还能避免手动计算的逻辑错误,优先推荐使用。
内容的提问来源于stack exchange,提问作者TravellingSalesman12344
相关产品推荐
相关产品推荐

