从三个元组中添加边_网络x [英] add_edges_from three tuples networkx
本文介绍了从三个元组中添加边_网络x的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用networkx创建DiGraph。我希望使用add_edges_from()
,并且希望从三个元组生成边及其数据。
我正在从CSV文件导入数据。我有三列:一列是ID(第一组节点),一列是一组名称(第二组节点),另一列是容量(文件中没有标头)。因此,我为ID和容量创建了一个词典。
dictionary = dict(zip(id, capacity))
然后我压缩了包含边数据的元组:
List = zip(id, name, capacity)
但当我执行下一行时,它给我一个断言错误。
G.add_edges_from(List, 'weight': 1)
有人能帮我解决这个问题吗?我已经试了一个星期了,但一无所获。
附注:我是编程新手。
编辑:
所以,我找到了以下解决方案。老实说,我不确定它是如何工作的,但它做到了! 代码如下:
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})]
我正在使用网络单工。现在,我正在尝试找到一种方法来使flow Dict的输出更容易理解,因为它只显示流的ID。(也许我会尝试将它们输入到数据库中,然后返回整行数据,而不是只使用ID)。
推荐答案
对您的版本进行了一些改进。(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})]
这篇关于从三个元组中添加边_网络x的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文