如何在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
相关产品推荐
相关产品推荐

