Python中如何批量计算数据集中两组3D坐标点的欧氏距离?
实现方案
以下是两种可直接运行的解决方法:
方法1:调用你已写好的自定义函数
通过pandas的apply方法按行传递参数即可调用你写的距离函数,逻辑直观适合新手理解:
# 你的自定义距离函数 def distance(x1, y1, z1, x2, y2, z2): d = math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2) + math.pow(z2 - z1, 2)* 1.0) return d # 新增距离列 df['distance'] = df.apply(lambda row: distance(row['x1'], row['y1'], row['z1'], row['x2'], row['y2'], row['z2']), axis=1)
注意:axis=1表示按行遍历DataFrame,每次取一整行数据传入函数
方法2:Numpy向量化计算(性能更优)
你提到的数组运算逻辑可以直接用,不需要循环,数据量较大时效率远高于逐行调用函数:
# 分别提取两组3D坐标的数组 p1 = df[['x1', 'y1', 'z1']].values p2 = df[['x2', 'y2', 'z2']].values # 按行计算欧氏距离,直接赋值为新列 df['distance'] = np.sqrt(np.sum((p1 - p2)**2, axis=1))
完整可运行测试代码
你可以直接运行以下代码验证效果:
import numpy as np import pandas as pd import math # 生成测试数据集 data = np.random.randint(5,30,size=(10,6)) df = pd.DataFrame(data, columns=['x1', 'y1', 'z1', 'x2', 'y2', 'z2']) # 方法1 自定义函数实现(二选一即可) # def distance(x1, y1, z1, x2, y2, z2): # d = math.sqrt(math.pow(x2 - x1, 2) + # math.pow(y2 - y1, 2) + # math.pow(z2 - z1, 2)* 1.0) # return d # df['distance'] = df.apply(lambda row: distance(row['x1'], row['y1'], row['z1'], row['x2'], row['y2'], row['z2']), axis=1) # 方法2 向量化实现(二选一即可) p1 = df[['x1', 'y1', 'z1']].values p2 = df[['x2', 'y2', 'z2']].values df['distance'] = np.sqrt(np.sum((p1 - p2)**2, axis=1)) # 输出结果 print(df)
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

