使用 NumPy 计算欧几里得距离

2024 年 8 月 29 日 | 阅读 3 分钟

欧几里得距离是两个点在任何轴上的最短距离。换句话说,它是两个点之间的位移长度。给定二维平面上的两个点 A (a, b) 和 B (c, d),A 和 B 之间的欧几里得距离为

距离 = √ (a-c) 2 + (b - d) 2
  • 计算三维平面上两点之间的距离

设 A (x1, y1, z1) 和 B (x2, y2, z2) 为两点

距离 = √ (x1 - x2) 2 + (y1 - y2) 2 + (z1 - z2)2

我们可以使用 Python 的 NumPy 库,无需提及完整公式即可计算两个向量之间的欧几里得距离。

本文讨论了如何使用 Python 的 NumPy 库的功能来计算欧几里得距离。

2. 不使用 NumPy 的通用方法

输出

Euclidian distance between point1 and point2:  3.0
  • 我们取了两个列表,并存储了 2 个点的 x、y 和 z 坐标。通过传统地访问列表元素,我们使用上述公式计算了两点之间的欧几里得距离。

2. 使用 NumPy

  • 向量是 1*1 矩阵。所有向量都是数组。因此,我们使用数组来表示向量。

1. 使用 linealg.norm() 方法

向量的范数是向量的大小,表示为 ||vector||。

  • 有 8 种范数 L1, L2, Lp...L∞
  • L2 范数也称为“欧几里得范数”,是两个向量之间的最短距离。

公式

||x||2 = √ ∑ni=1 |xi|2
  • 我们使用库中的 **norm() 方法**,根据提供的参数和值来查找 8 种可用范数中的一种。

语法

numpy. linealg. norm (vector, ord = None, axis = None)

代码

输出

Euclidian distance between p1 and p2:  9.273618495495704
  • 在之前的程序中,我们没有使用列表,而是使用 numpy 数组来存储点的坐标。numpy 数组和列表之间的唯一区别是 numpy 数组只能存储一种数据类型的元素,而列表可以存储不同数据类型的元素。
  • 我们使用 lineal. norm() 计算欧几里得距离,而无需使用公式。

2. 使用 dot() 方法

  • dot() 方法用于计算点积。我们使用此函数来计算坐标差的平方和。

代码

输出

Euclidian distance between p1 and p2:  9.273618495495704

理解

此处,

p1 = 4i + 7j + 9k

p2 = 10i + 12j + 14k

差值 = p1 - p2 = (4 - 10)i + (7 - 12)j + (9 - 14)k = **-6i + -5j + -5k**

difference. T -> 转置(因为是 1*1 矩阵,所以不变)=

[-6, -5, -5]

dot ([-6, -5, -5], [-6, -5, -5]) = (-6*-6) + (-5*-5) + (-5*-5) = 86

sqrt (sum_sq) = √86 = 9.27

3. square() 和 sum() 方法

这两个方法和它们的名字一样简单。一个用于计算向量的和,另一个用于计算向量的平方。

代码

输出

Euclidian distance between p1 and p2:  9.273618495495704