如何计算 Python 中的距离

How to calculate the distance in Python

假设我有两个点数组,我想知道每个点之间的距离是多少。

例如:

array_1 = [p1,p2,p3,p4]
array_2 = [p5,p6]

p1 到 p6 是点,类似于 [1,1,1] (3D)

我想要的输出是

output = [[distance of p1 to p5, distance of p2 to p5, ... distance of p4 to p5], 
          [distance of p1 to p6, distance of p2 to p6, ... distance of p4 to p6]]

如果我想使用 numpy,最好的方法是什么?

此答案并非专门针对 numpy 数组,但可以轻松扩展以包含它们。模块 itertools.product 是你的朋友。

# Fill this with your formula for distance
def calculate_distance(point_1, point_2):
    distance = ...
    return distance

# The itertools module helps here
import itertools
array_1, array_2 = [p1, p2, p3, p4], [p5, p6]

# Initialise list to store answers
distances = []

# Iterate over every combination and calculate distance
for i, j in itertools.product(array_1, array_2):
    distances.append(calculate_distance(i, j)

可以先把两个数组排列成m×1×31×n×3的形状,然后减去坐标:

delta = array_1[:,None] - array_2

接下来我们可以对坐标的差进行平方,求和,然后我们可以计算平方根:

distances = np.sqrt((delta*delta).sum(axis=2))

现在 distances 是一个 m×n 矩阵,第 ij 个元素是 i-第一个数组的第一个元素,j-第二个数组的第一个元素。

例如,如果我们有数据:

>>> array_1 = np.arange(12).reshape(-1,3)
>>> array_2 = 2*np.arange(6).reshape(-1,3)

我们得到结果:

>>> delta = array_1[:,None] - array_2
>>> distances = np.sqrt((delta*delta).sum(axis=2))
>>> distances
array([[ 2.23606798, 12.20655562],
       [ 3.74165739,  7.07106781],
       [ 8.77496439,  2.23606798],
       [13.92838828,  3.74165739]])

array_1的第一个元素坐标为(0,1,2),array_2的第二个元素坐标为(6,8,10)。因此距离是:

>>> np.sqrt(6*6 + 7*7 + 8*8)
12.206555615733702

这是我们在 distances[0,1]distances 数组中看到的。

上述函数方法可以计算任意维数的欧氏距离。鉴于 array_1array_2 具有相同维数(1D、2D、3D 等)的点,这可以计算点的距离。