使用networkx创建加权有向图的Python文件读取

8

我是一个 Python 和 Spyder 的新手。 我正在尝试使用 networkx 从格式化的文本文件中读取数据并生成图形:

FromNodeId  ToNodeId    Weight
0   1   0.15
0   2   0.95
0   3   0.8
0   4   0.5
0   5   0.45
0   6   0.35
0   7   0.4
0   8   0.6
0   9   0.45
0   10  0.7
1   2   0.45
1   11  0.7
1   12  0.6
1   13  0.75
1   14  0.55
1   15  0.1
...

我希望使用能够存储如此大的图(大约10k个节点,40k个边)的Networkx图格式。

import networkx as nx
import matplotlib.pyplot as plt

g = nx.read_edgelist('test.txt', nodetype=int, create_using= nx.DiGraph())

print(nx.info(g))
nx.draw(g)
plt.show()

当我运行这段代码时,什么也没有发生。 我使用Spyder进行编辑。 你能帮忙吗?谢谢!

"什么都没有发生",就像打印函数甚至没有打印一样?也许在nx.read_edgelist(...)中有一个错误没有显示出来。请在命令行中尝试。此外,如果您复制并粘贴了代码,则缩进错误,并且您的“G”未传递给函数,而是“g”。 - hyamanieu
1个回答

7

您需要使用符号#在第一行添加注释(默认情况下,read_edgelist会跳过以#开头的行):

#FromNodeId  ToNodeId    Weight
 0   1   0.15
 0   2   0.95
 0   3   0.8

然后修改调用 read_edgelist 的代码,以定义权重列的类型:
import networkx as nx
import matplotlib.pyplot as plt

g = nx.read_edgelist('./test.txt', nodetype=int,
  data=(('weight',float),), create_using=nx.DiGraph())

print(g.edges(data=True))
nx.draw(g)
plt.show()

输出:

[(0, 1, {'weight': 0.15}), (0, 2, {'weight': 0.95}), (0, 3, {'weight':
0.8}), (0, 4, {'weight': 0.5}), (0, 5, {'weight': 0.45}), (0, 6, {'weight': 0.35}), (0, 7, {'weight': 0.4}), (0, 8, {'weight': 0.6}), (0, 9, {'weight': 0.45}), (0, 10, {'weight': 0.7}), (1, 2, {'weight':
0.45}), (1, 11, {'weight': 0.7}), (1, 12, {'weight': 0.6}), (1, 13, {'weight': 0.75}), (1, 14, {'weight': 0.55}), (1, 15, {'weight':
0.1})]

enter image description here


你知道为什么语法是data=(('weight',float),)吗?我的意思是在内部括号右边加上逗号。我没有在networkx的文档文件中看到解释。也许这只是按照这种方式编写的规则? - nosense
据我所知,这个解决方案是读写networkx中有向图的唯一方法,因为邻接表(.adjlist)不能保留边的方向。我使用nx.write_edgelist(G, "test_graph.edgelist")来写入一个有向图,并使用上述read_edgelist从磁盘中读取它。 - Rony Armon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接