修复Pandas与固定值计算欧氏距离时的维度错误问题
解决Pandas中计算欧氏距离时的
ValueError: XB must be a 2-dimensional array问题 问题原因
你遇到的错误核心在于currency.bc.values返回的是一维的object数组(每个元素是一个元组),而scipy.spatial.distance.cdist要求输入必须是二维数值数组(每一行代表一个坐标点)。你单独测试cdist([l['bc']], [l['bc']])能成功,是因为两边都是包含单个元组的列表,cdist会自动将其解析为二维结构;但currency.bc.values的结构不符合要求,所以触发了错误。
解决方案
我们只需要把bc列的元组数据转换成标准的二维数值数组,就能正常使用cdist计算欧氏距离了。下面是完整的实现步骤:
转换
bc列为二维数组
用tolist()把每个元组转成列表,再通过np.array生成(n,2)的二维数组(n是DataFrame的行数):import numpy as np from scipy.spatial.distance import cdist # 把bc列的元组转换成二维数值数组 bc_coords = np.array(currency['bc'].tolist())定义固定点并计算距离
固定点需要用列表包裹(让cdist识别为二维输入),然后计算所有点到固定点的欧氏距离:# 你的固定目标点 fixed_point = (2126.5, 2657.0) # 计算所有距离,[0]用来提取一维的距离数组 distances = cdist([fixed_point], bc_coords, 'euclidean')[0]找到最短距离及对应行
用np.min获取最短距离,np.argmin找到对应的索引,再用iloc提取该行数据:min_distance = np.min(distances) min_distance_index = np.argmin(distances) closest_row = currency.iloc[min_distance_index] print(f"最短欧氏距离: {min_distance:.2f}") print("距离最近的行数据:") print(closest_row)
完整示例代码
import pandas as pd import numpy as np from scipy.spatial.distance import cdist # 模拟你的DataFrame数据 data = { 'Stype': [45,46,47,60,61,62,63,64,68,162], 'h': ['currency']*10, 'line': [38,38,39,39,39,39,40,39,39,30], 'y': [1344,1343,1342,2718,2717,2718,2716,2715,2874,3311], 'y2': [1382,1381,1381,2757,2756,2757,2756,2754,2913,3341], 'bc': [(1731.0, 1363.0), (2015.0, 1362.0), (2267.5, 1361.5), (488.0, 2737.5), (813.5, 2736.5), (1332.5, 2737.5), (1821.5, 2736.0), (2286.5, 2734.5), (2287.5, 2893.5), (1104.5, 3326.0)] } currency = pd.DataFrame(data) # 固定目标点 fixed_point = (2126.5, 2657.0) # 转换bc列为二维数组 bc_coords = np.array(currency['bc'].tolist()) # 计算欧氏距离 distances = cdist([fixed_point], bc_coords, 'euclidean')[0] # 获取最短距离和对应行 min_dist = np.min(distances) closest_row = currency.iloc[np.argmin(distances)] # 输出结果 print(f"最短欧氏距离: {min_dist:.2f}") print("对应的行数据:") print(closest_row)
额外提示
如果你的bc列里存在非元组的无效值,建议先做数据清洗:
# 过滤掉bc列不是元组的行 currency = currency[currency['bc'].apply(lambda x: isinstance(x, tuple))]
内容的提问来源于stack exchange,提问作者Manu64
相关产品推荐
相关产品推荐

