从三个元组中添加边_网络x [英] add_edges_from three tuples networkx

查看:23
本文介绍了从三个元组中添加边_网络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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆