使用NumPy计算欧几里德距离
任意坐标轴上两点之间的欧几里德距离是它们之间的最短距离。换句话说,它是两点之间的位移长度。给定二维平面上的两点A(a,b)和B(c,d),A和B之间的欧几里德距离如下所示:
2 2
- 要找到三维平面上两点之间的距离:
设A(x 1 ,y 1 ,z 1 )和B(x 2 ,y 2 ,z 2 )为两点:
1 2 2 1 2 2 1 2 2
我们可以使用Python中的NumPy库 来找到两个向量之间的欧几里德距离,而不需要提及整个公式。
本文讨论了如何使用Python中NumPy库的功能来计算欧几里德距离。
不使用NumPy的一般方法
import math
point1 = [1, 3, 5]
point2 = [2, 5, 3]
sqrs = (point1 [0] - point2 [0])**2 + (point1[1] - point2[1])**2 + (point1[2] - point2[2])**2
euc_dist = math. sqrt (sqrs)
print ("Euclidian distance between point1 and point2: ", euc_dist)
输出:
Euclidian distance between point1 and point2: 3.0
- 我们取了两个列表,存储了2个点的x、y和z坐标。通过传统的访问列表元素的方式,使用上述公式计算了两个点之间的欧几里得距离。
使用NumPy
- 向量是1*1的矩阵。所有的向量都是数组。因此,我们使用数组来表示向量。
1. 使用linealg.norm()方法
向量的范数是向量的大小,用||vector||表示。
- 共有8种范数L1,L2,Lp…L∞
- L2范数也被称为”欧几里得范数”,是两个向量之间的最短距离。
公式:
2ni=1i2
- 我们在库中使用norm()方法来根据参数和提供的值找到其中一种8种可用的范数。
语法:
代码:
import numpy as n
p1 = n. array ((4, 7, 9))
p2 = n. array ((10, 12, 14))
euc_dist = n. linalg. norm (p1 - p2)
print ("Euclidian distance between p1 and p2: ", euc_dist)
输出:
Euclidian distance between p1 and p2: 9.273618495495704
- 在之前的程序中,我们使用numpy数组来存储点的坐标,而不是使用列表。numpy数组和列表的唯一区别是,numpy数组只能存储一个数据类型的数据,而列表可以存储不同的数据类型。
- 不需要使用公式,我们使用lineal.norm()函数来计算欧几里得距离。
2. 使用dot()方法
- dot()方法用于计算点积。 我们使用这个函数来计算坐标差的平方和。
代码:
import numpy as n
p1 = n. array ((4, 7, 9))
p2 = n. array ((10, 12, 14))
difference = p1 - p2
sum_sq = n. dot (difference. T, difference)
euc_dist = n. sqrt (sum_sq)
print ("Euclidian distance between p1 and p2: ", euc_dist)
输出:
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
差的转置(由于是1 * 1的矩阵,不发生变化) =
[-6, -5, -5]
点积([-6, -5, -5]和[-6, -5, -5]的运算) = (-6-6) + (-5-5) + (-5*-5) = 86
开方(sum_sq) = √86 = 9.27
3. square()和sum()方法
这两个方法的功能与它们的名称一样简单。其中一个用于计算矢量的和,另一个用于计算矢量的平方。
代码:
import numpy as n
p1 = n. array ((4, 7, 9))
p2 = n. array ((10, 12, 14))
difference = p1 - p2
sq_of_diff = n. square (difference)
sum_of_sq = n. sum (sq_of_diff)
euc_dist = n. sqrt (sum_of_sq)
print ("Euclidian distance between p1 and p2: ", euc_dist)
输出:
Euclidian distance between p1 and p2: 9.273618495495704