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

时间:2020-02-26 17:17:24

标签: python list numpy euclidean-distance array-broadcasting

我想编写一个函数来计算list_a中的坐标到list_b中的每个坐标之间的欧几里得距离,并产生一个{ {1}}列(其中ab中的坐标数,alist_a中的坐标数。

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

b

运行该函数将生成:

list_b

我一直在尝试运行以下

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]])

谢谢。

5 个答案:

答案 0 :(得分:1)

我认为这可行

  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

答案 1 :(得分:0)

在这里,您只需使用np.linalg.norm即可计算出欧几里得距离。您的错误是由于np。减法期望两个输入的长度相同。

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]]

答案 2 :(得分:0)

我希望这能回答问题,但这是重复的; Minimum Euclidean distance between points in two different Numpy arrays, not within

# 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)

答案 3 :(得分:0)

另一种方法是:

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]])

此代码可以用更加简单有效的方式编写,因此,如果您发现任何可以改进的代码,请在注释中告知我。

答案 4 :(得分:0)

我想知道是什么原因阻止了您使用Scipy。由于无论如何您都在使用numpy,也许您可​​以尝试使用Scipy,它并不那么笨重。

为什么?
它具有许多数学函数和有效的实现方式,可以最大程度地利用并行处理。

请记住,这里的 distance_matrix 功能正是您所提到的目的。

具体地,它获取list_a(m x k矩阵)和list_b(n x k矩阵),并输出两个矩阵上每对点之间具有p范数(对于欧几里得而言,p = 2)的m x n矩阵。

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