Python中计算坐标列表与指定坐标的欧氏距离时遇TypeError问题求助
解决Python列表减法导致的TypeError问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: unsupported operand type(s) for -: 'list' and 'list',本质原因很简单:Python原生列表不支持直接用-做元素级减法,而你代码里的x是Geo_Shape列的原生列表,[cord]*len(x)也是列表,所以减不了。
给你两个实用的解决办法:
方法一:转成Numpy数组再计算
直接把列表转成Numpy数组,数组天然支持元素级运算,完美适配np.linalg.norm:
import numpy as np import pandas as pd # 假设你的df和cord已经定义 cord = [1.2,5.3] df['Distances'] = df['Geo_Shape'].apply(lambda x: np.linalg.norm(np.array(x) - np.array(cord), axis=1))
这个方法效率更高,尤其是当你的坐标列表很长的时候——Numpy的向量运算比循环快得多。axis=1参数是告诉Numpy,对每一组坐标对(数组的行)计算欧氏距离。
方法二:用列表推导式逐个计算
如果你更习惯直观的循环逻辑,也可以遍历每个坐标点单独计算:
df['Distances'] = df['Geo_Shape'].apply(lambda x: [np.linalg.norm(np.array(point) - np.array(cord)) for point in x])
这个写法会逐个处理x里的每个坐标点,把每个点转成数组后和cord做减法,再计算距离,结果也是一个列表,和你的需求完全匹配。
验证示例
用你给出的测试数据:
- Geo_Shape行数据:
[[1.2,2.3], [0.3,1.7], [3.2,9.1]] - cord:
[1.2,5.3]
运行代码后,你会得到结果:array([3. , 3.70809924, 4.29418211])(方法一)或者对应的列表(方法二),完全符合预期的欧氏距离计算结果。
内容的提问来源于stack exchange,提问作者Ouakrat
相关产品推荐
相关产品推荐

