我想在节点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.
非常感谢任何帮助!
答案 0 :(得分:2)
在您的代码中,您正在添加节点"1"
和"2"
等等(因为从文件读取将为您提供字符串,除非您明确转换它们。)
但是,您正在尝试引用节点1
和2
。我猜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"])