我生成具有任意节点的完整图。每条边都有两个属性,其中第二个属性是第一个属性的函数。 (例如,当第一个为 x 时,第二个为 1/x)。 如何将这些属性添加到边缘?
def create_random_topology(size):
G = nx.generators.complete_graph(size)
attfirst={x:random.randint(100,500) for x in G.edges()}
nx.set_edge_attributes(G, name="PR", values=attfirst)
#attsecond= 1/attfirst
我想要这个图表,例如
{(0,1):{PR= 10 , BW=1/10}, (0,2):{PR=5 , BW=1/5}, (1,2):{PR=2 , BW=1/2)}}
由于图形的大小可变,因此我无法访问具有其节点的确切名称的边,例如 (1,2)。
你显然可以从
attfirst
制作另一本字典:
nx.set_edge_attributes(G, name='BW', {e: 1/v for e, v in attfirst.items()})
假设该字典不再存在,您可以从
G.edges(data=True)
检索值:
nx.set_edge_attributes(G, name='BW', values={tuple(e): 1/data['PR']
for *e, data in G.edges(data=True)})
边缘数据示例(
size=5
):
G.edges(data=True)
EdgeDataView([(0, 1, {'PR': 295, 'BW': 0.003389830508474576}),
(0, 2, {'PR': 155, 'BW': 0.0064516129032258064}),
(0, 3, {'PR': 452, 'BW': 0.0022123893805309734}),
(0, 4, {'PR': 293, 'BW': 0.0034129692832764505}),
(1, 2, {'PR': 169, 'BW': 0.005917159763313609}),
(1, 3, {'PR': 204, 'BW': 0.004901960784313725}),
(1, 4, {'PR': 487, 'BW': 0.002053388090349076}),
(2, 3, {'PR': 322, 'BW': 0.003105590062111801}),
(2, 4, {'PR': 440, 'BW': 0.0022727272727272726}),
(3, 4, {'PR': 310, 'BW': 0.0032258064516129032})])