numpy学习笔记11:计算两个数组的欧氏距离
numpy学习笔记11:计算两个数组的欧氏距离
欧氏距离是指在多维空间中两点之间的直线距离,计算公式是各分量差的平方和的平方根。也就是说,如果有两个点P和Q,坐标分别是(p1, p2, ..., pn)和(q1, q2, ..., qn),那么它们之间的欧氏距离d就是√[(p1-q1)² + (p2-q2)² + ... + (pn-qn)²]。
计算两个数组的欧氏距离的普通办法:
def distance_no_numpy(arr1, arr2): if len(arr1) != len(arr2): raise ValueError("两个数组的长度必须相同") squared_sum = 0 for i in range(len(arr1)): squared_sum += (arr1[i] - arr2[i]) ** 2 return squared_sum ** 0.5# 示例数组 arr1 = [1, 2, 3] arr2 = [5, 4, 3] # 计算欧氏距离 distance = distance_no_numpy(arr1, arr2) print(f"不使用 NumPy 计算的欧氏距离: {distance}")
使用numpy计算两个数组的欧氏距离可以通过以下步骤实现
计算两个数组之间的欧氏距离的步骤是:
1. 计算两个数组的差值:diff = a - b
2. 对差值进行平方:squared_diff = np.square(diff)
3. 求和:sum_squared_diff = np.sum(squared_diff)
4. 取平方根:euclidean_distance = np.sqrt(sum_squared_diff)
计算两个数组的欧氏距离可以通过以下步骤实现,使用NumPy的高效向量化操作:
方法1:分步计算
-
计算差值:对应元素相减。
-
平方差值:逐元素平方。
-
求和:所有平方差值相加。
-
开平方:取总和的平方根。
import numpy as np # 示例数组 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 分步计算 diff = a - b # 差值: [-3, -3, -3] squared_diff = diff ** 2 # 平方: [9, 9, 9] sum_diff = np.sum(squared_diff) # 求和: 27 euclidean_distance = np.sqrt(sum_diff) # 平方根: 5.196 print("欧氏距离:", euclidean_distance)
方法2:使用 np.linalg.norm
直接计算两个数组差的 L2范数(即欧氏距离):
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) distance = np.linalg.norm(a - b) print("欧氏距离:", distance) # 输出: 5.196
扩展场景
1. 多维数组计算
若输入为二维数组(如矩阵行向量),需展平为一维或按行处理:
a = np.array([[1, 2], [3, 4]]) # 形状 (2,2) b = np.array([[5, 6], [7, 8]]) # 展平后计算整体距离 distance = np.linalg.norm(a.flatten() - b.flatten()) # 或逐行计算距离(每对行的距离) row_distances = np.linalg.norm(a - b, axis=1)
2. 批量计算(矩阵间所有行组合)
使用广播计算两个矩阵各行之间的欧氏距离:
X = np.array([[1, 2], [3, 4]]) # 形状 (2,2) Y = np.array([[5, 6], [7, 8]]) # 形状 (2,2) # 计算每对行的距离 distances = np.sqrt(np.sum((X[:, np.newaxis] - Y) ** 2, axis=2))
关键点总结
-
公式:d=∑i=1n(ai−bi)2d=∑i=1n(ai−bi)2。
-
效率:向量化操作(如
np.linalg.norm
)比显式循环快数百倍。 -
灵活性:适用于任意维度的数组(需形状一致或可广播)。
通过以上方法,可以高效计算任意形状数组的欧氏距离。