【Python】networkx讀取gml圖文件,有兩個問題影響使用

【問題描述】

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章