如何用NumPy计算二维数组每行与一维参考点的欧氏距离?
解决NumPy中二维数组每行与参考点的欧氏距离计算问题
没问题,我来帮你搞定这个计算需求!你遇到的维度问题其实是NumPy广播机制的小坑,用下面两种纯NumPy方法就能轻松解决:
方法1:手动广播计算(清晰直观)
利用NumPy的广播特性,我们可以直接让二维数组和一维参考点做元素级运算,步骤很明确:
- 计算每行与参考点的差值(广播自动匹配维度)
- 对差值平方后按行求和
- 对每行的和开根号得到欧氏距离
代码示例:
import numpy as np # 你的输入数组 pos = np.array([[ 1.72, 2.56], [ 0.24, 5.67], [ -1.24, 5.45], [ -3.17, -0.23], [ 1.17, -1.23], [ 1.12, 1.08]]) ref = np.array([1.22, 1.18]) # 计算差值 diff = pos - ref # 按行计算平方和的平方根 distances = np.sqrt(np.sum(diff ** 2, axis=1)) print(distances)
方法2:用np.linalg.norm简化代码
NumPy的线性代数模块里的norm函数可以直接计算向量的L2范数(也就是欧氏距离),指定axis=1就能按行处理:
distances = np.linalg.norm(pos - ref, axis=1)
这个方法更简洁,本质和方法1是一样的,只是把平方、求和、开根号的步骤封装成了一个函数。
结果验证
运行上面的代码后,得到的结果和你预期的近似值完全匹配:
[1.46833238 4.59673808 4.92838716 4.61085675 2.41039416 0.14142136]
为什么之前会遇到维度问题?
如果之前你尝试时出现维度不匹配的错误,大概率是不小心修改了ref的维度(比如把它变成了(2,1)的二维数组)。而你现在的ref是(2,)的一维数组,NumPy会自动将其广播为(6,2)的形状,和pos的维度完全匹配,所以减法运算可以顺利执行。
内容的提问来源于stack exchange,提问作者Human Error
相关产品推荐
相关产品推荐

