【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

 

你可能感兴趣的:(复杂网络,Python编程手册)