У меня есть неориентированный граф: 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, но бесполезно.
Я думаю, что твоя конструкция 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)])