当前位置: 首页 > news >正文

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:分步计算

  1. 计算差值:对应元素相减。

  2. 平方差值:逐元素平方。

  3. 求和:所有平方差值相加。

  4. 开平方:取总和的平方根。

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)比显式循环快数百倍。

  • 灵活性:适用于任意维度的数组(需形状一致或可广播)。

通过以上方法,可以高效计算任意形状数组的欧氏距离。

相关文章:

  • 【Python办公】提取Excel嵌入图片流程(代码前期步骤)
  • Redis 管道(Pipeline)深度解析:原理、场景与实战
  • C++菱形继承问题
  • 【Java】数组
  • Vlan初级实验
  • 漏洞知识点《PHP数组绕过深入解析》
  • go语言的包使用,以及错误处理
  • 亚马逊Prime Day新算法曝光,2025年流量分配机制大调整
  • numpy学习笔记10:arr *= 2向量化操作性能优化
  • 菜鸟之路Day24一一前端工程化(一)
  • 数据开发岗笔试题>>sql(hive) ,excel [2025]
  • 【论文阅读】实时全能分割模型
  • 分布式唯一ID生成算法——MongoDB ObjectId 算法
  • C#使用SnsPictureBox.dll绘制点,线段、圆、折线、多边形、测量尺等多种图形。
  • Elasticsearch 介绍:分布式搜索与分析引擎
  • 基于Babylon.js的Shader入门之五:让Shader支持法线贴图
  • Hyperlane:Rust 生态中的轻量级高性能 HTTP 服务器库,助力现代 Web 开发
  • SQL Server 触发器
  • Python中的列表:全面解析与应用指南
  • uniapp配置代理解决跨域问题
  • 蚂蚁集团将向全体股东分红
  • 国际观察|伦敦会谈“降级”凸显美国乌克兰政策窘境
  • 谭秀洪任广西梧州市人大常委会党组书记,此前任北海市委常委
  • 2025全球智慧城市指数排名揭晓,阿布扎比跃升至第五位
  • 特朗普支持率降至新低:宣布关税后骤降,选民最不满经济表现
  • 王励勤当选中国乒乓球协会新一任主席