【問題描述】
networkx可直接讀取gml文件:nx.read_gml(file),但是有兩個問題影響使用:
(1)一定要求gml文件中的節點有“label”鍵值對,不然會報錯
networkx.exception.NetworkXError: node #0 has no 'label' attribute
(2)對節點的索引必須爲label值。例如,G._node[label]、G.neighbors[label],以label索引,而不是id。如果你習慣通過節點編號0、1、2、..的方式進行節點索引,以及該編號同時用作矩陣下標對應,那麼會很難受。
【解決方案】
(1)改gml文件,節點統一標籤爲0、1、2、...;
(2)面對現實,規範代碼:不要拿節點編號做索引;
(3)修改代碼,做一個節點label對節點編號的反向索引;
例如,我寫了一個函數,對節點重新編碼,並基於新的編碼構建新圖,結束後再替換爲標籤
def build_new_G(G):
nodes = []
edges = []
nodes_id = dict()
nodes_label = dict()
edges_id = []
for id, label in enumerate(G.nodes()):
nodes_id[label] = id
nodes_label[id] = label
nodes.append(id)
for (v0, v1) in G.edges():
edges.append(nodes_id[v0], nodes_id[v1])
self.edges_id = deepcopy(edges)
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
return G, nodes_id, edges_id, nodes_label