赞
踩
【问题描述】
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。