Graph.get_adjacency()是缓慢的,输出是奇怪(Graph.get_adjacenc

2019-10-21 16:56发布

考虑在python-的igraph 0.7的图表对象-G。 如果我想G的邻接矩阵A,我必须写A=G.get_adjacency()但有两个问题:

  1. 即使G是稀疏的3000个节点,在很长一段时间在我的笔记本电脑商用时产生的。 有没有可能是邻接矩阵的创建是如此昂贵?
  2. 输出成为一个Matrix对象,所以如果我想与A上的numpy的模块进行操作,我必须把它先在列表中,然后转换成一个numpy.matrix。 此外,如果A是稀疏我需要在稀疏矩阵SciPy的第三转换。

是否有任何的igraph的方式获得稀疏图的scipy.sparse矩阵在合理的时间?

Answer 1:

  1. 不要紧,该图是稀疏与否,因为仍然IGRAPH将创建一个密集矩阵所以它是一个O(N 2)操作。 (在技术上,基体本身在C层,其中所述基质的为全零的初始化需要O(N 2),然后将其填充在O(那些m),其中n是顶点的数目,m是被创建边数-但随后的矩阵被转发到的Python层,其中它被转换成一个矩阵对象,和Python的层不知道该矩阵基本上是稀疏所以需要O(N 2),以将其转换,在我的笔记本电脑,拥有3000个节点创建一个图的邻接矩阵大约是500毫秒,我想这可能是正常的。

  2. 是的,有创造一个稀疏矩阵出的igraph图形的直线距离的一种方式,虽然这是一个有点冗长:

     from scipy.sparse import coo_matrix from numpy import hstack, ones def graph_to_sparse_matrix(graph): xs, ys = map(array, zip(*graph.get_edgelist())) if not graph.is_directed(): xs, ys = hstack((xs, ys)).T, hstack((ys, xs)).T else: xs, ys = xs.T, ys.T return coo_matrix((ones(xs.shape), (xs, ys))) 

该版本在同一图表转换为SciPy的稀疏矩阵在约26毫秒我的机器上。



文章来源: Graph.get_adjacency() is slow and the output is strange