为每个节点迭代变量| Python图中的节点连接

时间:2011-10-10 20:32:39

标签: python graph networkx

我想在节点1和图表中的其余节点之间找到节点连接。输入文本文件格式如下:

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)

工作但很乏味,不适合我的大型输入文件。当我手动添加边时,if循环条件有效,但是对于上面的代码抛出以下错误:

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.

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:2)

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

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

尝试更改此内容......

G.add_edge(src, dest)

到此:

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

答案 1 :(得分: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

答案 2 :(得分:0)

来自Networkx documentation

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没有您想要在其间创建边缘的节点。

答案 3 :(得分:0)

您还可以使用“is_connected()”使其更简单一些。 e.g。

$ 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

答案 4 :(得分:0)

另一种选择是将文件作为 Pandas 数据帧加载,然后使用 iterrows 进行迭代:

import pandas as pd
import networkx as nx

cols = ["src", "des", "wei"]
df = pd.read_csv('out40.txt', sep=" ", header=None, names=cols)
G = nx.empty_graph()

for index, row in df.iterrows():
    G.add_edge(row["src"], row["des"])