开发者

Iterate variable for every node | Node Connectivity in Python Graph

I would like to find node connectivity between node 1 and rest of the nodes in a graph. The input text file format is as follows:

1 2 1
1 35 1
8 37 1

and so on for 167 lines. First column represents source node, second column represents destination node while the last column represents weight of the edge.

I'm trying to read the source, destination nodes from input file and forming an edge between them. I need to then find out if it is a connected network (only one component of graph and no sub-components). Here is the code

from numpy import*
import networkx as nx
G=nx.empty_graph()

for row in file('out40.txt'):
    row = row.split()
    src = row[0]
    dest = row[1]
    #print src
    G.add_edge(src, dest)
    print src, dest

for i in range(2, 41):
    if nx.bidirectional_dijkstra(G, 1, i): print "path exists from 1 to ", i

manually adding the edges using

G.add_edge(1, 2)

works but is tedious and not suitable for large input files such as mine. The if loop condition works when I add edges manually but throws the following error for the above code:

in neighbors_iter
raise NetworkXError("The node %s is not in the graph."%(n,))
networkx.excep开发者_如何学运维tion.NetworkXError: The node 2 is not in the graph.

Any help will be much appreciated!


In your code, you're adding nodes "1" and "2" et cetera (since reading from a file is going to give you strings unless you explicitly convert them).

However, you're then trying to refer to nodes 1 and 2. I'm guessing that networkx does not think that 2 == "2".

Try changing this...

G.add_edge(src, dest)

to this:

G.add_edge(int(src), int(dest))


Not sure if that is an option for you, but are you aware of the build-in support of networkx for multiple graph text formats?

The edge list format seems to apply pretty well to your case. Specifically, the following method will read your input files without the need for custom code:

G = nx.read_weighted_edgelist(filename)

If you want to remove the weights (because you don't need them), you could subsequently do the following:

for e in G.edges_iter(data=True):
    e[2].clear()                   #[2] is the 3rd element of the tuple, which 
                                   #contains the dictionary with edge attributes


From Networkx documentation:

for row in file('out40.txt'):
    row = row.split()
    src = row[0]
    dest = row[1]
    G.add_nodes_from([src, dest])
    #print src
    G.add_edge(src, dest)
    print src, dest

The error message says the the graph G doesn't have the nodes you are looking to create an edge in between.


You can also use "is_connected()" to make this a little simpler. e.g.

$ cat disconnected.edgelist
1 2 1
2 3 1
4 5 1
$ cat connected.edgelist 
1 2 1
2 3 1
3 4 1
$ ipython

In [1]: import networkx as nx

In [2]: print(nx.is_connected(nx.read_weighted_edgelist('disconnected.edgelist')))
False

In [3]: print(nx.is_connected(nx.read_weighted_edgelist('connected.edgelist')))
True


Another option is to load the file as a pandas dataframe and then use iterrows to iterate:

import pandas as pd
import networkx as nx

cols = ["src", "des", "wei"]
df = pd.read_csv('out40.txt', sep=" ", header=None, names=cols)
G = nx.empty_graph()

for index, row in df.iterrows():
    G.add_edge(row["src"], row["des"])
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜