1

我正在尝试使用 networkx 创建有向图。我想使用add_edges_from(),并且我希望从三个元组生成边缘及其数据。

我正在从 CSV 文件导入数据。我有三列:一列用于 ids(第一组节点),一列用于一组名称(第二组节点),另一列用于容量(文件中没有标题)。因此,我为 id 和容量创建了一个字典。

dictionary = dict(zip(id, capacity))

然后我压缩了包含边缘数据的元组:

List = zip(id, name, capacity)

但是当我执行下一行时,它给了我一个断言错误。

G.add_edges_from(List, 'weight': 1)

有人可以帮我解决这个问题吗?我已经尝试了一周没有运气。

PS我是编程新手。

编辑:

所以,我找到了以下解决方案。老实说,我不确定它是如何工作的,但它确实完成了工作!这是代码:

import networkx as nx
import csv
G = nx.DiGraph()
capacity_dict = dict(zip(zip(id, name),capacity))
List = zip(id, name, capacity)
G.add_edges_from(capacity_dict, weight=1)
for u,v,d in List:
    G[u][v]['capacity']=d

现在当我运行时:

G.edges(data=True)

结果将是:

[(2.0, 'First', {'capacity': 1.0, 'weight': 1}), (3.0, 'Second', {'capacity': 2.0, 'weight': 1})]

我正在使用网络单工。现在,我正在尝试找到一种方法来使 flowDict 的输出更易于理解,因为它只显示流的 id。(也许我会尝试将它们输入数据库并返回整行数据,而不是仅使用 ID)。

4

1 回答 1

2

对您的版本进行了一些改进。(1) NetworkX 算法假定权重为 1,除非您特别设置不同。因此,无需在您的情况下明确设置它。(2) 使用生成器允许显式设置容量属性,并且还可以为每个记录设置一次其他属性。(3) 使用生成器来处理每条记录,这样您就不必对整个列表进行两次迭代。在小型数据集上,性能提升可能可以忽略不计,但仍然感觉更优雅。话虽如此 - 你的方法显然有效!

import networkx as nx
import csv

# simulate a csv file.
# This makes a multi-line string behave as a file.
from StringIO import StringIO
filehandle = StringIO('''a,b,30
b,c,40
d,a,20
''')

# process each row in the file
# and generate an edge from each
def edge_generator(fh):
    reader = csv.reader(fh)
    for row in reader:
        row[-1] = float(row[-1]) # convert capacity to float
        # add other attributes to the dict() below as needed...
        # e.g. you might add weights here as well.
        yield (row[0], 
               row[1], 
               dict(capacity=row[2]))

# create the graph
G = nx.DiGraph()
G.add_edges_from(edge_generator(filehandle))

print G.edges(data=True)

返回这个:

[('a', 'b', {'capacity': 30.0}), 
 ('b', 'c', {'capacity': 40.0}), 
 ('d', 'a', {'capacity': 20.0})]
于 2013-08-14T08:13:20.580 回答