从 Python 中的集合计算欧几里得距离

时间:2021-06-17 10:03:59

标签: python arrays numpy

我有一个数组 S(i),它包含 x 坐标 j 的所有接近 i 的索引值,即如果 S(1) = {2,3} 这意味着 x2 和 x3 接近x1。我总共有 S(1), ..., S(N) 个集合。

所以这部分代码工作正常:

arr = np.array([[1,3], [2,8],[3,1],[6,18], [9,8]]) 

arr = [item[0] for item in arr] #Extract x-coordinates

def Si(x): #This is the set i want to use
    return [[j for j in range(len(x)) if np.abs(x[j] - x[i]) < 2] for i in range(len(x))]

现在我有 j 的下标,我想计算 S(i) 中 (x_i,y_i) 到每个 (x_j,y_j) 之间的欧几里德距离,例如对于 i=1,如果 S(1) = { 7},求(x_1, y_1)和(x_7, y_7)之间的距离,对于i=2,如果S(2) = {3,9},求(x_2,y_2)和(x_3,y_3)之间的距离和(x_2,y_2) 和 (x_9,y_9) 并对每个 i 重复。

我不知道如何实现这一点,我真的很困惑!这是一个欧几里得距离代码,它为数组中的所有值找到它,但不在我想要的集合中。

def euc_dist(arr):
  
    arr_x = (arr[:,0,np.newaxis].T - arr[:,0,np.newaxis])**2 ##x-coordinates
    arr_y = (arr[:,1,np.newaxis].T - arr[:,1,np.newaxis])**2 ##y-coordinates
    arr = np.sqrt(arr_x + arr_y)

    return arr

1 个答案:

答案 0 :(得分:0)

这应该有效:

S = Si(arr) # get the array
def my_fn(i): # take the value of i
    euc_dists = []
    for j in S[i]: # iterate over j's in S[i]
        if i!= j:
            dist = np.linalg.norm(arr[i]-arr[j]) # euclidean distance
            euc_dists.append(dist)
    return euc_dists