如何在Python中计算距离

时间:2020-03-27 19:39:56

标签: python-3.x numpy euclidean-distance

让我说我有两个点阵列,我想知道每个点之间的距离是什么。

例如:

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,什么是最好的方法?

2 个答案:

答案 0 :(得分:2)

此答案并非专门针对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)

答案 1 :(得分:2)

您可以先将两个数组排列为 m×1×3 1×n×3 形状,然后减去坐标:

delta = array_1[:,None] - array_2

接下来,我们可以对坐标中的差异求平方,然后计算总和,然后我们就可以计算出平方律:

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

现在distances是一个 m×n 矩阵,其第 i 个元素之间的距离为 ij 个元素第一个数组的元素,第二个数组的 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的{​​{1}}数组中看到的。

上述函数方法可以计算任意数量尺寸的 Euclidean 距离。假设distances[0,1]array_1都具有尺寸相同的点(1D,2D,3D等),则可以计算这些点的距离。