计算两个python数组之间的欧几里得距离



我想写一个函数来计算list_a中的坐标到list_b中的每个坐标之间的欧几里得距离,并生成一个由b列组成的维度为a行的距离数组(其中alist_a中的坐标数,blist_b中的坐标数目

注意:为了简单起见,我不想使用numpy以外的任何库。

list_a = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
list_b = np.array([[0,1],[5,4]])

运行该函数将生成:

>>> np.array([[0., 5.830951894845301],
[2.236, 3.605551275463989],
[5.830951894845301, 0.],
[5.830951894845301, 2.8284271247461903],
[4.123105625617661, 2.23606797749979]])

我一直在尝试运行以下

def run_euc(list_a,list_b):
euc_1 = [np.subtract(list_a, list_b)]
euc_2 = sum(sum([i**2 for i in euc_1]))
return np.sqrt(euc_2)

但我得到了以下错误:

ValueError: operands could not be broadcast together with shapes (5,2) (2,2)

谢谢。

这里,您只需要使用np.linalg.norm来计算欧几里得距离。您的错误是由于np.subtract期望两个输入具有相同的长度。

import numpy as np
list_a = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
list_b = np.array([[0,1],[5,4]])
def run_euc(list_a,list_b):
return np.array([[ np.linalg.norm(i-j) for j in list_b] for i in list_a])
print(run_euc(list_a, list_b))

代码产生:

[[0.         5.83095189]
[2.23606798 3.60555128]
[5.83095189 0.        ]
[5.83095189 2.82842712]
[4.12310563 2.23606798]]

我想知道是什么阻止了您使用Scipy。既然你无论如何都在使用numpy,也许你可以尝试使用不那么重的Scipy。

为什么
它有许多具有高效实现的数学函数,可以充分利用您的计算能力。

考虑到这一点,这里有一个distance _ matrix函数,正好用于您提到的目的。

具体地说,它取list_a(mx k矩阵(和list_b(nx k矩阵。

from scipy.spatial import distance_matrix
distances = distance_matrix(list_a, list_b)

我认为这适用于

import numpy as np
def distance(x,y):
x=np.array(x)
y=np.array(y)
p=np.sum((x-y)**2)
d=np.sqrt(p)
return d

使用scipy,可以计算每对之间的距离,如下所示:

import numpy as np
from scipy.spatial import distance
list_a = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
list_b = np.array([[0,1],[5,4]])
dist = distance.cdist(list_a, list_b, 'euclidean')
print(dist)

结果:

array([[0.        , 5.83095189],
[2.23606798, 3.60555128],
[5.83095189, 0.        ],
[5.83095189, 2.82842712],
[4.12310563, 2.23606798]])

另一种方法是:

np.array(
[np.sqrt((list_a[:,1]-list_b[i,1])**2+(list_a[:,0]-list_b[i,0])**2) for i in range(len(list_b))]
).T

输出:

array([[0.        , 5.83095189],
[2.23606798, 3.60555128],
[5.83095189, 0.        ],
[5.83095189, 2.82842712],
[4.12310563, 2.23606798]])

这个代码可以用更简单高效的方式编写,所以如果你在代码中发现任何可以改进的地方,请在评论中告诉我。

我希望这能回答问题,但这是对;两个不同Numpy数组中点之间的最小欧几里得距离,不在内

# Import package
import numpy as np
# Define unequal matrices
xy1 = np.array([[0,1], [2,2], [5,4], [3,6], [4,2]])
xy2 = np.array([[0,1],[5,4]])
P = np.add.outer(np.sum(xy1**2, axis=1), np.sum(xy2**2, axis=1))
N = np.dot(xy1, xy2.T)
dists = np.sqrt(P - 2*N)
print(dists)

最新更新