簡體   English   中英

計算兩個python數組之間的歐幾里德距離

[英]Calculate Euclidean distance between two python arrays

我想要寫的函數來計算坐標之間的歐幾里得距離list_a每個中的坐標的list_b ,並產生尺寸的距離的陣列a列由b列(其中a是坐標的數量list_ablist_b的坐標list_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)

謝謝你。

我想知道是什么阻止了你使用 Scipy。 既然你無論如何都在使用 numpy,也許你可以嘗試使用 Scipy,它不是那么重。

為什么?
它具有許多具有高效實現的數學函數,可以充分利用您的計算能力。

考慮到這一點,這里有一個distance_matrix函數,正好用於您提到的目的。

具體來說,它需要你的 list_a (mxk 矩陣) 和 list_b (nxk 矩陣) 並輸出 mxn 矩陣,兩個矩陣的每對點之間的 p 范數 (p=2 為歐幾里得) 距離。

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

在這里,您可以使用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]]

我認為這有效

  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

我希望這能回答這個問題,但這是重復的; 兩個不同 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)

另一種方法是:

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

這段代碼可以用更簡單和有效的方式編寫,所以如果你發現代碼中有任何可以改進的地方,請在評論中告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM