Получение значений из словаря расстояний для построения матрицы расстояний - PullRequest
0 голосов
/ 03 мая 2019

У меня есть словарь, содержащий информацию о расстояниях в следующем формате

distances = {"a": {"b": 0.2, "c": 0.4}, "b": {"c": 0.6}}

Я хотел бы построить матрицу расстояний на основе порядка в списке:

order = ["a", "b", "c"]

Таким образом,желаемый результат должен выглядеть примерно так:

[
 0, 0.2, 0.4
 0.2 , 0, 0.6
 0.4, 0.6, 0
]

Я пробовал следующее, но я не уверен, как двигаться дальше.Любая помощь приветствуется

dist = np.zeros((len(order), len(order)))
for index1, member1 in enumerate(order):

    curr = distances.get(member1, {})
    for index2, member2 in enumerate(order):
        val = curr.get(member2, None)
        if member2 not in curr:
            val = None
        dist[index1, index2] = val

Ответы [ 4 ]

0 голосов
/ 04 мая 2019

Можете ли вы попробовать это и дайте мне знать, соответствует ли это вашему требованию.

distances = {"a": {"b": 0.2, "c": 0.4}, "b": {"c": 0.6}}
order = ["a", "b", "c"]
N = len(order)

#Create N*N array of 0's
dist = [[0]*N for _ in range(N)]


# New dict for array indexing
dd = {'a':0,'b':1,'c':2}

def set_items(x,y,val):
    if x!=y : 
        dist[x][y] = dist[y][x] = val  

#dictionary comprehension of the distances dict. 
[set_items(dd[k],dd[k1],v1) for k,v in distances.items() for k1,v1 in v.items()]

print(dist)

#### Output ####
[
 [0, 0.2, 0.4],
 [0.2, 0, 0.6],
 [0.4, 0.6, 0]
] 
0 голосов
/ 03 мая 2019

Я предполагаю, что вы гарантированно определите расстояние так или иначе.Поэтому я предлагаю использовать try/except/finally блок, где вы можете перевернуть, каким образом вы ищите элементы.

import numpy as np

distances = {"a": {"b": 0.2, "c": 0.4}, "b": {"c": 0.6}}
order = ["a", "b", "c"]
dist = np.zeros((len(order), len(order)))

for i, member1 in enumerate(order):
    for j, member2 in enumerate(order):

        if member1 != member2:
            try:
                d = distances[member1][member2]
            except KeyError as e:
                d = distances[member2][member1]
            finally:
                dist[i][j] = d

print(dist)
# [[0.  0.2 0.4]
#  [0.2 0.  0.6]
#  [0.4 0.6 0. ]]
0 голосов
/ 03 мая 2019

Вы можете сделать это:

distances = {"a": {"b": 0.2, "c": 0.4}, "b": {"c": 0.6}}
order = ["a", "b", "c"]
dist = np.zeros((len(order), len(order)))

for index1, member1 in enumerate(order):
    curr = distances.get(member1, {})
    for index2, member2 in enumerate(order):
        dist[index1, index2] = curr.get(member2, 0)

print(dist + np.swapaxes(dist, 0, 1))
0 голосов
/ 03 мая 2019

это должно работать, но предполагается, что ваш словарь упорядочен так же, как ваш список, и все пары существуют:

l = len(ordered_list)
result = np.zeros((l, l))
for i in range(l):
    for j in range(l):
        if i == j:
            continue
        elif i < j:
            result[i][j] = distances[ordered_list[i]][ordered_list[j]]
        else:
            result[i][j] = distances[ordered_list[j]][ordered_list[i]]

, если это предположение не выполняется, более надежное решение -

l = len(ordered_list)
result = np.zeros((l, l))
for i in range(l):
    for j in range(l):
        if i == j:
            continue
        try:
            result[i][j] = distances[ordered_list[i]][ordered_list[j]]
        except KeyError:
            try:
                result[i][j] = distances[ordered_list[j]][ordered_list[i]]
            except:
                raise Exception("pair {0}, {1} does not exist. ". format(ordered_list[i],ordered_list[j]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...