Вы можете использовать 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)}}