2011-10-10 19 views
0

我想找到节点1和图形中其余节点之间的节点连接。输入文本文件格式如下:为每个节点|重复变量Python中的节点连接图

1 2 1 
1 35 1 
8 37 1 

等了167线。第一列表示源节点,第二列表示目的地节点,而最后一列表示边缘的权重。

我试图从输入文件中读取源节点,并在它们之间形成一条边。然后我需要知道它是否是一个连接的网络(图中只有一个组件并且没有子组件)。下面是代码

from numpy import* 
import networkx as nx 
G=nx.empty_graph() 

for row in file('out40.txt'): 
    row = row.split() 
    src = row[0] 
    dest = row[1] 
    #print src 
    G.add_edge(src, dest) 
    print src, dest 

for i in range(2, 41): 
    if nx.bidirectional_dijkstra(G, 1, i): print "path exists from 1 to ", i 

使用

G.add_edge(1, 2) 

作品手动添加的边缘,但是繁琐和不适合大型输入文件,如矿。该如果循环条件的作品时,我手动添加的边缘,但引发以下错误上面的代码:

in neighbors_iter 
raise NetworkXError("The node %s is not in the graph."%(n,)) 
networkx.exception.NetworkXError: The node 2 is not in the graph. 

任何帮助将非常感激!

回答

2

在你的代码中,你正在添加节点"1""2"等等(因为从文件读取会给你字符串,除非你明确地转换它们)。

但是,您正在尝试引用节点12。我猜networkx不认为2 == "2"

尝试修改此...

G.add_edge(src, dest) 

这样:

G.add_edge(int(src), int(dest)) 
+0

谢谢!有效。 – learner

+0

@bhanu:如果这是您的正确解决方案,请将其标记为(并投票给有用的答案) – Rabarberski

+0

@Rabarberski我做到了!谢谢。 – learner

0

Networkxdocumentation

for row in file('out40.txt'): 
    row = row.split() 
    src = row[0] 
    dest = row[1] 
    G.add_nodes_from([src, dest]) 
    #print src 
    G.add_edge(src, dest) 
    print src, dest 

错误消息说,图G没有您正在寻找在这两者之间建立一个边缘节点。

+0

Amber回答了它!我没有将它转换为整数。谢谢! – learner

2

不知道这是一个选择,但你知道的内置的支持networkx的用于多图文本格式

edge list format似乎很适用于您的情况。具体来说,有以下方法将读取你的输入文件,而无需自定义代码:

G = nx.read_weighted_edgelist(filename) 

如果你想删除的权重(因为你并不需要他们),你可以随后执行以下操作:

for e in G.edges_iter(data=True): 
    e[2].clear()     #[2] is the 3rd element of the tuple, which 
            #contains the dictionary with edge attributes 
+0

谢谢,我没有看着它。我会探讨这一点。 – learner

+0

我已经编辑了我的答案,'read_weighted_edgelist()'方法正是你想要的。 – Rabarberski

+0

太棒了!我想我将来会在使用加权边缘时使用它。目前,处理未加权的边缘。谢谢! – learner

0

您也可以使用“is_connected()”使其更简单一些。例如

$ cat disconnected.edgelist 
1 2 1 
2 3 1 
4 5 1 
$ cat connected.edgelist 
1 2 1 
2 3 1 
3 4 1 
$ ipython 

In [1]: import networkx as nx 

In [2]: print(nx.is_connected(nx.read_weighted_edgelist('disconnected.edgelist'))) 
False 

In [3]: print(nx.is_connected(nx.read_weighted_edgelist('connected.edgelist'))) 
True 
+0

感谢@aric,我使用'nx.number_connected_components(G)'来查找图形是否连接。但是,我想知道是否有方法可以连接图的两个断开连接的组件。你知道有任何方法吗?谢谢。 – learner

相关问题