如何用Python计算X与Z中每个子列表的欧氏距离
计算点与点集的欧氏距离(Python实现)
已知点集:
x = [[0.5697071, 0.447144773, 0.45310486]] z = [ [0, 0.47144773043356025, 0], [0, 0.47144773043356025, 0.4531048568095023], [0.5697070991026062, 0.47144773043356025, 0.4531048568095023], [0, 0, 0] ]
需求:计算x中的点与z中每个点的欧氏距离,此前尝试列表解包方法出错。
方法1:纯Python实现(无需第三方库)
先将x从二维列表提取为一维点,再遍历z逐个计算距离:
import math x = [[0.5697071, 0.447144773, 0.45310486]] z = [ [0, 0.47144773043356025, 0], [0, 0.47144773043356025, 0.4531048568095023], [0.5697070991026062, 0.47144773043356025, 0.4531048568095023], [0, 0, 0] ] # 提取x中的单个点(二维转一维) point_x = x[0] distances = [] for point_z in z: # 计算各维度差的平方和 squared_sum = sum((px - pz)**2 for px, pz in zip(point_x, point_z)) # 开平方得到欧氏距离 distances.append(math.sqrt(squared_sum)) print(distances)
输出结果:
[0.7373859333577432, 0.5697650477093533, 0.02430295743356025, 0.7999999999999999]
方法2:numpy批量计算(高效简洁)
利用numpy的广播机制和范数函数,无需手动循环:
import numpy as np x = np.array([[0.5697071, 0.447144773, 0.45310486]]) z = np.array([ [0, 0.47144773043356025, 0], [0, 0.47144773043356025, 0.4531048568095023], [0.5697070991026062, 0.47144773043356025, 0.4531048568095023], [0, 0, 0] ]) # axis=1表示按行计算每个点与x的欧氏距离 distances = np.linalg.norm(x - z, axis=1) print(distances.tolist())
输出与纯Python方法一致。
关于列表解包出错的说明
x是二维列表,直接解包会拿到整个子列表而非单个元素(比如a,b,c = x会报错,因为x只有1个元素)。必须先通过x[0]提取出一维的点,再进行后续操作。
内容的提问来源于stack exchange,提问作者sai
相关产品推荐
相关产品推荐

