евклидово расстояние между списками внутри списка - PullRequest
0 голосов
/ 22 сентября 2019

Я хотел бы рассчитать евклидово расстояние между списками внутри списка, и если это расстояние меньше порогового значения, чем получить максимальный элемент таких списков.

Мое решение дает мне расстояние между каждыми двумя списками, но я хочуобъединить каждый список с любым другим.В основном, решение с двумя петлями, вероятно.

yhat = [[10 , 15, 200 ,220], [20 , 25, 200 ,230], [30 , 15, 200 ,230], [100 , 150, 230 ,300], [110 , 150, 240 ,300] ]

def euclidean(v1, v2):
    return sum((p-q)**2 for p, q in zip(v1, v2)) ** .5

it = iter(yhat)
prev = next(it)
ec =[]
for ind, ele in enumerate(it):
    ec.append(euclidean(ele, prev))
    prev = ele
ec

Подводя итог, я хотел бы новый список xhat, который содержит элементы:

xhat = [[30 , 35, 200 ,230], [110 , 150, 240 ,300] ]

1 Ответ

1 голос
/ 22 сентября 2019

Вы можете использовать enumerate и itertools.combinations, чтобы сделать это довольно коротким:

from itertools import combinations

out = defaultdict(lambda: defaultdict(dict))
for (i, v1), (j, v2) in combinations(enumerate(yhat), 2):
    out.setdefault(i, {})[j] = euclidean(v1, v2)

out
{0: {1: 17.320508075688775, 2: 22.360679774997898, 3: 183.3712082089225, 4: 190.3286631067428}, 
 1: {2: 14.142135623730951, 3: 166.80827317612278, 4: 173.8533865071371}, 
 2: {3: 170.07351351694948, 4: 176.4227876437735}, 
 3: {4: 14.142135623730951}}

, где отображаются карты в единицах в вашем входном списке с расстоянием между векторами в этих значениях.Вы можете получить элементы max для векторов, расстояние которых меньше порога, например:

for (i, v1), (j, v2) in combinations(enumerate(yhat), 2):
    if euclidean(v1, v2) < threshold:
        out.setdefault(i, {})[j] = (max(v1), max(v2))
out
{0: {1: (220, 230), 2: (220, 230), 3: (220, 300), 4: (220, 300)}, 
 1: {2: (230, 230), 3: (230, 300), 4: (230, 300)}, 
 2: {3: (230, 300), 4: (230, 300)}, 
 3: {4: (300, 300)}}
...