You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中计算两个NumPy数组的欧氏距离?

计算NumPy数组间的欧氏距离

嘿,刚接触Python不用慌,这个计算欧氏距离的需求其实用NumPy就能轻松搞定,甚至还有更便捷的工具可选,我给你一步步讲清楚:

首先先明确你的数组定义

先把你给出的数组用代码写好(记得先导入NumPy):

import numpy as np

X = np.array([[ 5.43840675, -1.05259078, -0.21793506, 8.56686818, -2.58056957, -0.07310339, -0.31181501, 0.02696586], 
              [ 5.72318296, -0.99665473, -0.14540062, 8.32051008, -3.36201189, -0.04897565, -0.34271698, -0.0339766 ]])
Y = np.array([[ 5.72318296, -0.99665473, -0.14540062, 8.32051008, -3.36201189, -0.04897565, -0.34271698, -0.0339766 ], 
              [ 5.43840675, -1.05259078, -0.21793506, 8.56686818, -2.58056957, -0.07310339, -0.31181501, 0.02696586]])

情况1:计算对应行之间的欧氏距离

如果你想计算X的第i行和Y的第i行之间的距离(比如X[0] vs Y[0],X[1] vs Y[1]),直接用np.linalg.norm计算两个数组差的L2范数就行——这正是欧氏距离的定义:

# 计算对应行的欧氏距离,axis=1表示沿着每个行的维度计算范数
row_distances = np.linalg.norm(X - Y, axis=1)
print(row_distances)

运行后你会得到两个值,分别是两行对应向量的距离。

情况2:计算所有行两两之间的欧氏距离

你提到X[1]和Y[0]完全相等,它们的距离应为0——这种两两配对的需求,我们可以用两种方式实现:

方式一:纯NumPy实现(无需额外库)

利用NumPy的广播机制,把X和Y扩展维度后相减,再计算范数:

# 给X增加一个中间维度,变成(2, 1, 8);给Y增加一个开头维度,变成(1, 2, 8)
# 这样广播后就能得到所有行对的差值矩阵,形状是(2, 2, 8)
diff = X[:, np.newaxis, :] - Y[np.newaxis, :, :]
# 沿着最后一个维度(特征维度)计算L2范数,得到(2,2)的距离矩阵
pairwise_distances = np.linalg.norm(diff, axis=2)
print(pairwise_distances)

运行后输出的矩阵里,pairwise_distances[1, 0]就是0,正好对应你说的X[1]和Y[0]的距离。

方式二:用SciPy的cdist(更简洁)

如果你安装了SciPy库,cdist函数可以直接帮你计算两个数组所有行对的距离,指定metric='euclidean'即可:

from scipy.spatial.distance import cdist

pairwise_distances = cdist(X, Y, metric='euclidean')
print(pairwise_distances)

这个方法代码更短,结果和上面的纯NumPy实现完全一致。

小补充:欧氏距离的本质

其实欧氏距离就是两个向量对应元素差的平方和的平方根,用公式表示就是:

$d(a,b) = \sqrt{\sum_{i=1}^n (a_i - b_i)^2}$
而np.linalg.norm(a - b)就是帮你完成这个计算,默认就是L2范数(对应欧氏距离),所以不用额外指定参数。

内容的提问来源于stack exchange,提问作者Man.utd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:22:29