在 networkx 中重新标记图的节点

Raj*_*Raj 0 networkx

我正在尝试处理 wiki-Vote.txt ( https://snap.stanford.edu/data/wiki-Vote.html ) 中给出的图表。有 7115 个节点,id 范围从 3 到 8297。我想重新标记从 0 到 7114 的节点。我检查了 relabel_nodes() 中的映射,但仍然无法解决问题。请建议。谢谢

Joe*_*oel 6

编辑 我不确定它是否是新的,但我的原始答案没有提到 nx.convert_node_labels_to_integers(G, first_label=0, ordering='default', label_attribute=None). 所以对于给定的图形G,你可以做到 H=nx.convert_node_labels_to_integers(G)。这并不能保证顺序与 中的相同GH如果您调用 ,您可以将原始标签存储在其中H=nx.convert_node_labels_to_integers(G, label_attribute='original_name')。您可以G通过设置来保证顺序与 中相同ordering=sorted(G.nodes())

原答案

给定一个G包含一些节点集的图,最简单的事情是

mapping = {old_label:new_label for new_label, old_label in enumerate(G.nodes())}
H = nx.relabel_nodes(G, mapping)
Run Code Online (Sandbox Code Playgroud)

这将创建一个字典,mapping其键是旧标签,其值是新标签(阅读字典理解)。新标签的顺序由G.nodes()返回值(您无法控制)的顺序给出。新图H更改了节点标签。

如果你想要一个特定的顺序,你需要适当地对 G.nodes() 进行排序。所以你可以做

nodelist = G.nodes()
nodelist.sort()
mapping = {old_label:new_label for new_label, old_label in enumerate(nodelist)}
H = nx.relabel_nodes(G, mapping)
Run Code Online (Sandbox Code Playgroud)

这将使它们按数字顺序排序(如果节点名称是字符串,则按字母顺序排序)。如果您想要其他一些自定义顺序,则必须弄清楚如何对节点列表进行排序。