преобразовать кортеж dict в networkx.Graph

1

У меня есть неориентированный граф: G, он имеет узлы, ребра и веса. Я создаю его из использования DataFrame:

G = nx.Graph()
for key,value in df_couple.iterrows():   
    from_point = str(value[0])
    to_point = str(value[1])
    edgeweight = float(value[2])
    G.add_weighted_edges_from([(from_point, to_point, edgeweight)])

Затем я вычисляю кратчайшее расстояние между всеми узлами, используя:

dis = nx.all_pairs_dijkstra_path_length(G, cutoff=None, weight='weight')

Я проверяю тип dis is 'generator', поэтому я использую:

In [23]:item = next(dis)

In [24]:item

Out[24]: 
('13537625459___1020004',
 {'13537625459___1020004': 0,
  '20-72-0D-39-01-6E___1020002': 0.40973195335611445,
  '20-72-0D-39-01-89___1020002': 0.24834431946516566,
  '20-72-0D-39-01-8A___1020002': 0.40973195335611445,
  '20-72-0D-39-01-8B___1020002': 0.40973195335611445,
  '20-72-0D-39-01-8D___1020002': 0.24026806227171532,
  '20-72-0D-39-02-96___1020002': 0.40973195335611445,
  '20-72-0D-39-02-A3___1020002': 0.40973195335611445,
  '20-72-0D-39-02-D4___1020002': 0.3179114489450109,
  '20-72-0D-39-02-DF___1020002': 0.23809674037229048,
  '20-72-0D-39-02-EF___1020002': 0.18307326555472847,
  '20-72-0D-39-02-F8___1020002': 0.23809674037229048})

In [25]:type(item)
Out[25]: tuple

Мне нужно преобразовать элемент (или dis) в формат [nx.Graph] для следующего шага, поэтому я использую:

G_dis = nx.Graph(dict([item]))

Затем я нахожу только узлы, края - это успех, но вес не таков:

    In [28]:G_dis.nodes()
    Out[28]: NodeView(('13537625459___1020004', '20-72-0D-39-02EF___1020002', 
    '20-72-0D-39-02-DF___1020002', '20-72-0D-39-02-F8___1020002',
    '20-72-0D-39-01-8D___1020002', '20-72-0D-39-01-89___1020002', 
    '20-72-0D-39-02-D4___1020002', '20-72-0D-39-01-8A___1020002',
    '20-72-0D-39-01-8B___1020002', '20-72-0D-39-02-96___1020002', 
    '20-72-0D-39-02-A3___1020002', '20-72-0D-39-01-6E___1020002'))

    In [29]:G_dis.edges()
    Out[29]: EdgeView([('13537625459___1020004', '13537625459___1020004'), 
    ('13537625459___1020004', '20-72-0D-39-02-EF___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-02-DF___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-02-F8___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-01-8D___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-01-89___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-02-D4___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-01-8A___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-01-8B___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-02-96___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-02-A3___1020002'), 
    ('13537625459___1020004', '20-72-0D-39-01-6E___1020002')])


  In[30]:G_dis.get_edge_data('13537625459___1020004','13537625459___1020004')
  Out[30]: {}

почему вес {}?, он должен иметь float like'0.40973195335611445 ', но после преобразования он станет пустым.

Я пытаюсь выполнить nx.from_dict_of_dicts (d); nx.from_dict_of_lists (d) и другие подобные функции в сетиx, но бесполезно.

Теги:
graph
networkx

1 ответ

0
Лучший ответ

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

Это должно работать:

G_dis = nx.Graph()
for p1, d in nx.all_pairs_dijkstra_path_length(G, cutoff=None, weight='weight'):
    for p2, w in d.items():
        G_dis.add_weighted_edges_from([(p1, p2, w)])
  • 0
    Это сработало - я могу получить график с весом - но мой график очень большой - около 2 000 000 узлов и 1 500 000 ребер. Так что этот цикл вызовет ошибку памяти. Как оптимизировать этот цикл в моей ситуации , или другие методы могут избежать ошибки памяти при преобразовании в График。
  • 0
    Представьте, что у вас 100 узлов с 99 ребрами и одной длинной линией. После вашей процедуры у вас будет 9900 (!) Ребер, так как каждый узел будет иметь 99 ребер для остальных. Для больших графиков с разреженными соединениями в какой-то момент вам не хватит памяти. Лучший вопрос, что вы пытаетесь решить?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню