在networkx中将节点名称映射到索引及其反向映射

9 投票
2 回答
11716 浏览
提问于 2025-04-18 16:14

给定一个 networkx 图,有没有办法将节点的名字和它在邻接矩阵中的索引相互转换?

我知道 G.nodes() 会返回一个列表,这个列表中节点的索引正好对应它在邻接矩阵中的索引。

所以为了把节点的名字转换成节点的索引,我用了一种很笨的方法,就是把节点的索引存储在一个字典里,然后通过节点的名字来查找。

要把节点的索引转换成它的名字,我又创建了一个类似的字典,只不过这次是把键和值对调了。

有没有更好的方法来做到这一点呢?

2 个回答

1

对于小型或中等规模的图,一个简单的方法是把节点的名字存成一个列表:

nodes_list = np.array(list(g.nodes()))

如果你想通过索引找回名字,比如:

node_name = nodes_list[4]

如果你想通过名字找回索引:

node_id = np.where(nodes_list == "n4")[0][0]
5

简短的回答是:我知道的情况是这样。虽然我有一堆和你类似的代码,但做了一些改进。

你可以做的第一件事是记住,每个节点都有一个字典挂在上面。G.node[node_name] 是一个字典,可以存放你想要的任何信息。因此,你可以这样做:

G.node[node_name]['index'] = G.nodes().index(node_name)

这样至少可以把信息挂在图上,但和你的方法一样,这种方式也很脆弱:如果你修改了图,G.nodes() 的行为就没有文档说明了。

一个可能更好的解决方案是使用 G.adjacency_matrixnodelist 参数。这个参数接受一个节点名称的列表,并按照这个顺序输出邻接矩阵。这样,你就可以根据你的应用需求,合理地设置这个列表,而不是依赖 G.nodes() 的伪随机行为。例如,如果你的节点命名得当,你可以传入一个排序后的节点列表(sorted(G.nodes()))。

撰写回答