在NumPy中计算坐标间欧氏距离的代码逻辑疑问
解释NumPy计算欧氏距离的常见两行代码
假设你写的是NumPy中计算欧氏距离的标准两行代码(毕竟这是最常用的实现方式),我来拆解它们的作用和背后的原理:
先看最典型的写法:
diff = x1 - x2 distance = np.sqrt(np.sum(diff ** 2))
或者另一种更简洁的变体:
diff = x1 - x2 distance = np.linalg.norm(diff)
第一行:diff = x1 - x2
这一步是计算两个坐标点对应维度的差值:
- 假设
x1和x2是代表n维空间点的NumPy数组(比如x1 = np.array([1, 2]),x2 = np.array([4, 6]))。 - NumPy的数组减法是逐元素操作,每个维度的数值会分别相减,得到的
diff数组里的每个元素就是对应维度的差值(上面的例子里diff会是[-3, -4])。 - 这正好对应欧氏距离公式的第一步:对每个维度计算
(x_i - y_i)。
第二行的两种实现逻辑
情况1:distance = np.sqrt(np.sum(diff ** 2))
这一行完整实现了欧氏距离的核心计算:
diff ** 2:对diff里的每个元素做平方操作,对应公式中的(x_i - y_i)^2;np.sum(...):把所有平方后的元素求和,对应公式里的Σ(x_i - y_i)^2;np.sqrt(...):对求和结果开平方根,得到最终的欧氏距离√Σ(x_i - y_i)^2。
情况2:distance = np.linalg.norm(diff)
np.linalg.norm是NumPy线性代数模块的范数计算函数,默认计算的是L2范数——而L2范数的定义恰好就是欧氏距离。
- 它内部和第一种情况做了完全相同的操作(平方→求和→开根号),只是把这些步骤封装成了更简洁的函数调用,适合追求代码简洁性的场景。
举个直观的例子验证:
import numpy as np x1 = np.array([0, 0]) # 原点 x2 = np.array([3, 4]) # 3-4-5直角三角形的顶点 diff = x1 - x2 # 得到 [-3, -4] distance = np.sqrt(np.sum(diff ** 2)) # 计算√(9+16)=5,和手动计算结果一致
内容的提问来源于stack exchange,提问作者Mudits
相关产品推荐
相关产品推荐

