0

我想在图中找到节点 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.

任何帮助都感激不尽!

4

5 回答 5

2

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

但是,您随后尝试引用节点12. 我猜那networkx不这么认为2 == "2"

试试改这个...

G.add_edge(src, dest)

对此:

G.add_edge(int(src), int(dest))
于 2011-10-10T20:42:27.850 回答
2

不确定这是否适合您,但您是否知道networkx 对多种图形文本格式的内置支持

边缘列表格式似乎非常适用于您的案例。具体来说,以下方法将读取您的输入文件,而无需自定义代码:

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
于 2011-10-10T20:45:57.637 回答
0

Networkx 文档

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

于 2011-10-10T20:41:33.810 回答
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
于 2011-10-11T12:23:53.273 回答
0

另一种选择是将文件加载为熊猫数据框,然后用于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"])
于 2021-05-26T13:29:43.690 回答