#python #matrix #graph
#python #матрица #График
Вопрос:
Я вычисляю оценки сходства для пары узлов в графе, результатом являются списки списков, как описано ниже: пример вывода
[[[(0, 1), 0.3666666666666667], [(0, 13), 0.3333333333333333], [(0, 20), 0.23809523809523808],
[(0, 23), 0.30952380952380953], [(20, 23), 0.21428571428571427], [(20, 31), 0.18253968253968253],
[(20, 45), 0.21428571428571427], [(20, 46), 0.23809523809523808], [(20, 81), 0.27142857142857146],
[(22, 24), 0.39285714285714285], [(22, 45), 0.39285714285714285], [(24, 45), 0.2857142857142857],
[(24, 80), 0.6428571428571428], [(25, 26), 1.0], [(27, 28), 0.5333333333333333], [(27, 29), 0.45000000000000007],
[(29, 71), 0.375]]]
здесь у меня есть оценки сходства каждой пары узлов
Как я могу поместить это в матричную форму, где каждый столбец имеет узлы, а строки показывают оценку сходства?
Любая помощь будет высоко оценена
вот пример вывода
Комментарии:
1. Не могли бы вы привести пример того, как должен выглядеть результат?
2. У вас есть одна лишняя запятая в середине.
3. @ThePilotDude, вот только пример вывода
4. @kwkt, yah лишняя запятая отделяет пары узлов от их оценок сходства
5. Каждый узел сопряжен с каждым другим узлом?
Ответ №1:
Сначала я удалю один внешний уровень [ ]
и один из , ,
, чтобы мы могли преобразовать его в словарь в качестве шага, чтобы превратить его в матрицу.
a=[[[(0, 1), 0.3666666666666667], [(0, 13), 0.3333333333333333], [(0, 20), 0.23809523809523808], [(0, 23), 0.30952380952380953],[(20, 23), 0.21428571428571427], [(20, 31), 0.18253968253968253], [(20, 45), 0.21428571428571427], [(20, 46), 0.23809523809523808], [(20, 81), 0.27142857142857146], [(22, 24), 0.39285714285714285], [(22, 45), 0.39285714285714285], [(24, 45), 0.2857142857142857], [(24, 80), 0.6428571428571428], [(25, 26), 1.0], [(27, 28), 0.5333333333333333], [(27, 29), 0.45000000000000007], [(29, 71), 0.375]]]
a=a[0] # remove one external level of `[ ]`
b=dict(a)
таким образом, мы можем получить значение node (n, m) следующим образом:
if (n,m) in b.keys():
print(b[n,m])
else:
print(None) # or Zero
согласно максимальной размерности узлов, это 30 строк и 72 столбца, затем для преобразования словаря в массив берем значения и помещаем в матрицу
import numpy as np
a = [[[(0, 1), 0.3666666666666667], [(0, 13), 0.3333333333333333], [(0, 20), 0.23809523809523808],
[(0, 23), 0.30952380952380953], [(20, 23), 0.21428571428571427], [(20, 31), 0.18253968253968253],
[(20, 45), 0.21428571428571427], [(20, 46), 0.23809523809523808], [(20, 81), 0.27142857142857146],
[(22, 24), 0.39285714285714285], [(22, 45), 0.39285714285714285], [(24, 45), 0.2857142857142857],
[(24, 80), 0.6428571428571428], [(25, 26), 1.0], [(27, 28), 0.5333333333333333], [(27, 29), 0.45000000000000007],
[(29, 71), 0.375]]]
a=a[0] # remove one external level of `[ ]`
b = dict(a)
r = 30
c = 72
Nodes = np.zeros([r, c])
for k, values in b.items():
Nodes[k[1]][k[0]] = values
Теперь у нас есть узлы матрицы, в которых все значения исходного списка находятся в позиции (r, c). Остальные узлы имеют нули.
Комментарии:
1. Сначала я удалю один внешний уровень [ ] и один из , ,, чтобы мы могли преобразовать его в dictionary в качестве шага, чтобы превратить его в матрицу. «как вы это удалили» @Nour
2. Я обновил свой ответ, чтобы показать, как удалить внешний [] .
a=a[0]
Ответ №2:
Вы можете сделать что-то вроде этого:
lst = [[[(0, 1), 0.3666666666666667], [(0, 13), 0.3333333333333333], [(0, 20), 0.23809523809523808], [(0, 23), 0.30952380952380953], [(20, 23), 0.21428571428571427], [(20, 31), 0.18253968253968253], [(20, 45), 0.21428571428571427], [(20, 46), 0.23809523809523808], [(20, 81), 0.27142857142857146], [(22, 24), 0.39285714285714285], [(22, 45), 0.39285714285714285], [(24, 45), 0.2857142857142857], [(24, 80), 0.6428571428571428], [(25, 26), 1.0], [(27, 28), 0.5333333333333333], [(27, 29), 0.45000000000000007], [(29, 71), 0.375]]]
# list of nodes in the graph
nodes = set()
for (x, y), _ in lst[0]:
nodes.add(x)
nodes.add(y)
nodes = sorted(nodes)
# create the 2D array to store similarity
# here, -1 denotes no data
similarity = [[-1] * len(nodes) for _ in range(len(nodes))]
# fill the 2D array
for (x, y), val in lst[0]:
similarity[nodes.index(x)][nodes.index(y)] = val
# if you don't want symmetry, comment the next line out
similarity[nodes.index(y)][nodes.index(x)] = val