Manage edge's weight and attributes with Netoworkx

Question:

I’m facing on a trouble related to how I’m managing the edges and their weight and attributes in a MultiDiGraph.

I’ve a list of edges like below:

[
(0, 1, {'weight': {'weight': 0.8407885973127324, 'attributes': {'orig_id': 1, 'direction': 1, 'flip': 0, 'lane-length': 3181.294317920477, 'lane-width': 3.6, 'lane-shoulder': 0.0, 'lane-max-speed': 50.0, 'lane-typology': 'real', 'lane-access-points': 6, 'lane-travel-time': 292.159682258003, 'lane-capacity': 7200.0, 'lane-cost': 0.8407885973127324, 'other-attributes': None, 'linestring-wkt': 'LINESTRING (434757.15286960197 4524762.33387408, 434267.30180536775 4525511.90463009, 436180.7891782945 4526762.385413274)'}}}), 
(1, 4, {'weight': {'weight': 0.6659876355281887, 'attributes': {'orig_id': 131, 'direction': 1, 'flip': 0, 'lane-length': 2496.129360921626, 'lane-width': 3.6, 'lane-shoulder': 0.0, 'lane-max-speed': 50.0, 'lane-typology': 'real', 'lan...

That list is used to add weight and attributes to a MultiDiGraph previous mentioned:

 graph = ntx.MultiDiGraph(weight=None)
 graph.add_weighted_edges_from(edge_list)

Trying to read the properties of a single edge(graph.edges.data()) I see this:

(0, 1, {'weight': {'weight': 0.8407885973127324, 'attributes': {'orig_id': 1, 'direction': 1, 'flip': 0, 'lane-length': 3181.294317920477, 'lane-width': 3.6, 'lane-shoulder': 0.0, 'lane-max-speed': 50.0, 'lane-typology': 'real', 'lane-access-points': 6, 'lane-travel-time': 292.159682258003, 'lane-capacity': 7200.0, 'lane-cost': 0.8407885973127324, 'other-attributes': None, 'linestring-wkt': 'LINESTRING (434757.15286960197 4524762.33387408, 434267.30180536775 4525511.90463009, 436180.7891782945 4526762.385413274)'}}})

Every edge is builded in that way: [node[0], node[1], {'weight': weight, 'attributes': attributes}].
If I use this way: [node[0], node[1], weight], I see the right use of the weight but I need to use also the attributes.

[(0, 1, {'weight': 0.8407885973127324}), (1, 4, {'weight': 0.6659876355281887}), (1, 46, {'weight': None}), (4, 5, {'weight': 1.2046936800705539}), (4, 6, {'weight': 0.4469496439663275})....

What is the correct way to manage in the same time both weight and attributes?

Asked By: MaxDragonheart

||

Answers:

Using add_weighted_edges_from does not have an option to add independent edge attributes. It takes a list of triples (u,v,w) and consider w as the weight. That’s why, you find a nested dictionary in the weight attribute of the node.

You can add shared attribute for the bunch by specifying keyword argument:

graph.add_weighted_edgees_from([...], attr1=..., attr2=...)

but you will find the same attribute values for all edges in the bunch.

Instead, you can directly use the add_edge method in a for loop:

for u, v, attr in [...]:
   graph.add_edge(u, v, **attr)

which will add your edges with individual attributes.

Answered By: ftorre
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.