Networkx-如何获得显示节点ID而不是标签的节点之间的最短路径长度 [英] Networkx - How to get shortest path length between nodes showing node id instead of label

查看:535
本文介绍了Networkx-如何获得显示节点ID而不是标签的节点之间的最短路径长度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是第一次将NetworkX库与Python结合使用.

I'm new to using NetworkX library with Python.

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

Let's say that I import a Pajek-formatted file:

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

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

The contents of my file are (In Pajek, nodes are called "Vertices"):

*Network
*Vertices 6
123 Author1
456 Author2
789 Author3
111 Author4
222 Author5
333 Author6
*Edges 
123 333
333 789
789 222
222 111
111 456

现在,我要根据库文档计算网络中节点之间的所有最短路径长度,并且正在使用此功能

Now, I want to calculate all the shortest path lengths between the nodes in my network, and I'm using this function, per the library documentation

path = nx.all_pairs_shortest_path_length(G)

返回值:长度–由源和目标键入的最短路径长度字典.

Returns: lengths – Dictionary of shortest path lengths keyed by source and target.

我得到的回报:

print path
{u'Author4': {u'Author4': 0, u'Author5': 1, u'Author6': 3, u'Author1': 4, u'Author2': 1, u'Author3': 2}, u'Author5': {u'Author4': 1, u'Author5': 0, u'Author6': 2, u'Author1': 3, u'Author2': 2, u'Author3': 1}, u'Author6': {u'Author4': 3, u'Author5': 2, u'Author6': 0, u'Author1': 1, u'Author2': 4, u'Author3': 1}, u'Author1': {u'Author4': 4, u'Author5': 3, u'Author6': 1, u'Author1': 0, u'Author2': 5, u'Author3': 2}, u'Author2': {u'Author4': 1, u'Author5': 2, u'Author6': 4, u'Author1': 5, u'Author2': 0, u'Author3': 3}, u'Author3': {u'Author4': 2, u'Author5': 1, u'Author6': 1, u'Author1': 2, u'Author2': 3, u'Author3': 0}}

如您所见,这真的很难阅读,以后再使用...

As you can see, it's really hard to read, and to put to a later use...

理想情况下,我想返回的格式类似于以下内容:

Ideally, what I'd like is a return with a format similar to the below:

source_node_id, target_node_id, path_length
123, 456, 5
123, 789, 2
123, 111, 4

简而言之,我需要仅使用(或至少包括)节点ID来获得收益,而不仅仅是显示节点标签.而且,要使所有可能的对都在一条直线上,并具有最短的路径...

In short, I need to get a return using only (or at least including) the nodes ids, instead of just showing the node labels. And, to get every possible pair in a single line with their corresponding shortest path...

在NetworkX中有可能吗?

Is this possible in NetworkX?

功能参考: https://networkx.github.io/documentation/latest/reference/generation/networkx.algorithms.shortest_paths.unweighted.all_pairs_shortest_path_length.html

推荐答案

这样的事情怎么样?

import networkx as nx                                                            
G=nx.read_pajek("pajek_network_file.net")                                        
G=nx.Graph(G)
# first get all the lengths      
path_lengths = nx.all_pairs_shortest_path_length(G)                              

# now iterate over all pairs of nodes      
for src in G.nodes():
    # look up the id as desired                           
    id_src = G.node[src].get('id')
    for dest in G.nodes():                                                       
        if src != dest: # ignore self-self paths
            id_dest =  G.node[dest].get('id')                                    
            l = path_lengths.get(src).get(dest)                                  
            print "{}, {}, {}".format(id_src, id_dest, l) 

这将产生输出

111, 222, 1
111, 333, 3
111, 123, 4
111, 456, 1
111, 789, 2
...

如果您需要进行进一步处理(例如排序),则可以存储l值,而不仅仅是打印它们.

If you need to do further processing (e.g. sorting) then store the l values rather than just printing them.

(您可以使用 itertools.combinations( G.nodes(), 2),但是如果您不熟悉上面的方法,它会更加明确.)

(you could loop through pairs more cleanly with something like itertools.combinations(G.nodes(), 2) but the method above is a bit more explicit in case you aren't familiar with it.)

这篇关于Networkx-如何获得显示节点ID而不是标签的节点之间的最短路径长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆