我正在尝试处理 wiki-Vote.txt ( https://snap.stanford.edu/data/wiki-Vote.html ) 中给出的图表。有 7115 个节点,id 范围从 3 到 8297。我想重新标记从 0 到 7114 的节点。我检查了 relabel_nodes() 中的映射,但仍然无法解决问题。请建议。谢谢
编辑
我不确定它是否是新的,但我的原始答案没有提到
nx.convert_node_labels_to_integers(G, first_label=0, ordering='default', label_attribute=None). 所以对于给定的图形G,你可以做到
H=nx.convert_node_labels_to_integers(G)。这并不能保证顺序与 中的相同G。H如果您调用 ,您可以将原始标签存储在其中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)
这将使它们按数字顺序排序(如果节点名称是字符串,则按字母顺序排序)。如果您想要其他一些自定义顺序,则必须弄清楚如何对节点列表进行排序。