Python igraph : Fastest way to convert large graph to python-igraph graph

标签 python algorithm graph igraph

我有一个大型无向加权图,其中有约 375,000 个节点和约 3,400,000 个边,表示为邻接列表(字典的字典)。

例如

A --> (B,2), (C,4)
B --> (A,2)
C --> (A,4)

表示为

{A : {B : 2, C : 4}, B : {A : 2}, C : {A : 4}}

我想将此图转换为 python-igraph 图,然后运行 ​​walktrap 社区检测算法。我尝试过以下方法:

g = igraph.Graph()

for node in mygrpah.keys():
    g.add_vertex(name=node) # each node is a string

for node,neighbours in mygraph.iteritems():
    g.add_edges([(node,neighbour) for neighbour in neighbours.keys()])
    for neighbour in neighbours.keys():
        # to avoid adding edge while traversing neighbour's dictionary
        del mygraph[neighbour][node]  

我在具有 150,000 个节点的子图上对此进行了测试,在配备 4GB RAM 和 i5-4200U CPU @ 1.60GHz × 4 处理器的计算机上花了大约 11 个小时。

  1. 有更好的方法来进行转换吗?
  2. 是否有其他更快且支持 walktrap 社区检测算法的图库?

最佳答案

问题在于您要添加一条又一条边,由于底层数据结构的原因,这非常耗时。首先构建顶点列表和边列表,然后通过一次调用 add_edges(...) 添加所有边,速度要快得多。

mygraph = {"A" : {"B" : 2, "C" : 4}, "B" : {"A" : 2}, "C" : {"A" : 4}, "D":{}}
g = igraph.Graph(directed=False)
g.add_vertices(mygraph.keys())
edges = [(start, end) for start in mygraph.keys() for end in mygraph[start].keys()]
# or if you only want to have undirected links only once:
edges = [edge for edge in edges if edge[0] > edge[1]]
g.add_edges(edges)
igraph.plot(g)

关于Python igraph : Fastest way to convert large graph to python-igraph graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31180734/

相关文章:

python - Dijkstra 的算法只是 BFS,您还计算节点权重吗?

c++ - 如何在包装类(来自 C++)中覆盖 __setattr__?

python - 修改 Invoke 的 Config 类

algorithm - 高效累积大数据集的滑动窗口百分比变化

javascript - 如何用nodejs打包二维盒子?

plot - 如何使用方程在 Maxima 中绘制 3D 表面?

graph - 使用 redis 图

python - Google App Engine Base64 照片从 IOS 应用程序保存

python - 如何在 python 列表中编码 bs4 可导航字符串?

python - 使菱形方形分形算法无限大