[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [igraph] connecting disparate graphs
From: |
Tamas Nepusz |
Subject: |
Re: [igraph] connecting disparate graphs |
Date: |
Tue, 27 May 2008 15:43:39 +0200 |
Hi Kurt,
for example. i want to merge G1 and G2 into one big graph.
However, the web crawls are seperated by time, so the edges incident
to G1.vs[0] /= G2.vs[49] necessarily. So i figure i just want to
include all connections for both graphs into one new node
Anyway, is there any igraph functions that might help????
Graph.union is able to take the union of two (or more) graphs,
assuming that the vertices being united have the same IDs:
In [1]: g1=Graph([(0,1), (1,2), (2,3), (3,0)])
In [2]: g2=Graph([(0,2), (1,3)])
In [3]: g3=g1.union(g2)
In [4]: g3.get_edgelist()
Out[4]: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
Since this does not hold for your graph, I suggest a different approach:
1. Get the uids of the first and the second graph and store them in
two lists:
uids1, uids2 = g1.vs["uid"], g2.vs["uid"]
2. Create a dict that maps vertex IDs in g2 to vertex IDs in g1 based
on the uids:
mapping = {}
for i, uid in enumerate(uids2): mapping[i] = uids1.index(uid)
(this assumes that every uid in uids2 is to be found in uids1; if not,
you have to add an exception handler around uids1.index and add the
missing vertices to g1 as well)
3. Get the edge list of g2 and remap it according to the mapping
obtained in step 2:
el_remapped = [(mapping[v1], mapping[v2]) for v1, v2 in
g2.get_edgelist()]
4. Add the remapped edges to g1:
g1 += el_remapped
I hope it works, I did not try it, but I think the basic idea is
correct. If your edges also carry attributes, you'll have to add them
to the new edges in g1 afterwards.
--
Tamas