как преобразовать списки списков в массив в python?

#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