使用字符串的int部分访问字符串标签的节点

2024-06-28 19:34:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用NetworkX库和Python。在

我希望能够通过仅使用作为节点名称(字符串)一部分的一个int ID来引用一个节点,用于各种目的,比如获取两个节点之间的最短路径。在

MWE:

假设我导入了一个Pajek格式的文件:

import networkx as nx
G=nx.read_pajek("pajek_network_file.net")
G=nx.Graph(G)

我的文件的内容是(在Pajek中,节点被称为“顶点”):

^{pr2}$

我应该使用哪个命令,只使用节点Author4的id 111来打印它?在

到目前为止,我已经尝试了G.node[nodeid]的格式,比如:

print G.node[111]

但这会返回一个错误,因为它正在尝试搜索node LABEL=111,这当然不存在。在

作为后续问题,理想情况下,我不仅希望按ID打印节点,还希望将其与函数一起使用,例如

nx.shortest_path_length(G,source_nodeid,target_nodeid)

我目前所做的工作是创建一个.net网络文件,其中node id列重复两次,以便使用与“node label”相同的id号。在

我相信答案一定很简单,但我至今还没找到答案,即使在谷歌上搜索了很多东西并浏览了文档。。。 任何帮助都将不胜感激!在


Tags: 文件字符串答案networkx名称idnodenet
2条回答

我相信您正在寻找nx.relabel_nodes函数,它需要一个字典来将旧标签映射到新标签。我使用您提供的顶点名称来构建图。然后创建一个字典,将旧标签(完整字符串)映射到新标签(拆分后字符串的第一个元素的整数转换)。最后,我使用relabel_nodes函数来进行重新标记。在

我是如何用它来解决你的问题的:

G = nx.Graph()
vertices = ['123 Author1','456 Author2','789 Author3','111 Author4','222 Author5','333 Author6']
for v in vertices:
    G.add_node(v)
# Maps old labels to new labels
new_labels = dict( (i , int(i.split()[0]) ) for i in G.nodes() )
print new_labels
# Relabel nodes
nx.relabel_nodes(G,new_labels,False)  
# To access node with integer 123 for instance
print G[123]
# Draw the network with all labels
nx.draw_networkx(G, with_labels=True, node_size = 500)
plt.show()

enter image description here

例如,如果您想使用旧标签进行绘图,那么您可以使用另一个字典,它是新标签的反向字典,它只是将新标签映射到旧标签。您可以这样做:

^{pr2}$

enter image description here

networkx将图形的节点和边保存在字典结构中,其中节点是键,其数据是关联的字典结构。显然,当你阅读pajek文件格式的示例文件时,措辞如下:

>>> G = nx.read_pajek("test.pj")
>>> pprint(G.node)
{u'Author1': {'id': u'123'},
 u'Author2': {'id': u'456'},
 u'Author3': {'id': u'789'},
 u'Author4': {'id': u'111'},
 u'Author5': {'id': u'222'},
 u'Author6': {'id': u'333'}}

这意味着节点u'Author1'与数据{'id': u'123'}关联

现在,我不知道在Pajek文件格式中哪个字段应该是实际的节点(可能在networkx中没有正确实现?),但如果您将文件中的名称和ID颠倒过来,则会得到您想要的结果:

^{pr2}$

以及

>>> G = nx.read_pajek("test.pj")
>>> pprint(G.node)
{u'111': {'id': u'Author4'},
 u'123': {'id': u'Author1'},
 u'222': {'id': u'Author5'},
 u'333': {'id': u'Author6'},
 u'456': {'id': u'Author2'},
 u'789': {'id': u'Author3'}}
>>> G.node['111']
{'id': u'Author4'}

此外,节点id是字符串,而不是整数。如果需要整数,则可能需要重新标记节点。在

相关问题 更多 >