Python:将txt转换为gpickle并在Networkx中查找节点和边缘

时间:2017-10-31 17:32:16

标签: python-3.x networkx

我尝试将.txt转换为.gpickle,以便获取networkx中的节点和边缘。我使用以下代码:

M = open("data.txt", "r")
G=nx.path_graph(M)
>>> nx.write_gpickle(G,"data.gpickle")
>>> G=nx.read_gpickle("data.gpickle")

查找节点和边缘后:

G.nodes()
G.edges()

我得到了NodeView(())EdgeView([])等输出,其中应包含括号中的数值。我假设G=nx.path_graph(M)是问题所在,因为当我尝试使用引用中的示例时它工作正常:

>>> G = nx.path_graph(4)
>>> nx.write_gpickle(G, "test.gpickle")
>>> G = nx.read_gpickle("test.gpickle")

2 个答案:

答案 0 :(得分:0)

您拥有的是data.txt中的加权邻接矩阵,您使用的示例是创建路径图,该路径图与数据中的信息无关。为了创建正确的图表,networkx无法使用该格式直接读取它。但是,您可以使用numpypandas阅读data.txt,然后将其转换为networkx图表。 请参阅以下代码,以使用numpy获取图表:

import numpy as np
import networkx as nx

numpy_array = np.genfromtxt('data.txt', delimiter='\t', dtype='float')
G = nx.from_numpy_array(numpy_array)

现在你有了

In [1]: G.nodes()
Out[1]: NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15))
In [2]: G.edges()
Out[2]: EdgeView([(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (0, 13), (0, 14), (0, 15), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (1, 10), (1, 11), (1, 12), (1, 13), (1, 14), (1, 15), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (2, 11), (2, 12), (2, 13), (2, 14), (2, 15), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (3, 11), (3, 12), (3, 13), (3, 14), (3, 15), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (4, 10), (4, 11), (4, 12), (4, 13), (4, 14), (4, 15), (5, 6), (5, 7), (5, 8), (5, 9), (5, 10), (5, 11), (5, 12), (5, 13), (5, 14), (5, 15), (6, 7), (6, 8), (6, 9), (6, 10), (6, 11), (6, 12), (6, 13), (6, 14), (6, 15), (7, 8), (7, 9), (7, 10), (7, 11), (7, 12), (7, 13), (7, 14), (7, 15), (8, 9), (8, 10), (8, 11), (8, 12), (8, 13), (8, 14), (8, 15), (9, 10), (9, 11), (9, 12), (9, 13), (9, 14), (9, 15), (10, 11), (10, 12), (10, 13), (10, 14), (10, 15), (11, 12), (11, 13), (11, 14), (11, 15), (12, 13), (12, 14), (12, 15), (13, 14), (13, 15), (14, 15)])

要使用gpickle格式保存图表,请执行以下操作:

nx.write_gpickle(G, 'my_graph.gpickle')

现在您应该能够使用G = nx.read_gpickle('my_graph.gpickle')阅读它。

答案 1 :(得分:0)

根据您的数据,您可以使用networkx read_edgelist 函数直接读取它们,然后使用其Doc 将其写入pickle:

G = nx.read_edgelist('test.txt', delimiter='\t', data=[('weight', int)], create_using=nx.DiGraph())

nx.write_gpickle(G, "test.gpickle")