考虑python-igraph 0.7中的图形对象G.如果我想要G的邻接矩阵A,我必须写A=G.get_adjacency()
,但有两个问题:
在Igraph中是否有任何方法可以在合理的时间内获得稀疏图的scipy.sparse矩阵?
答案 0 :(得分:4)
图表是否稀疏并不重要,因为igraph仍然会创建一个密集矩阵,因此它是一个O(n 2 )运算。 (从技术上讲,矩阵本身是在C层创建的,矩阵初始化为全零,取O(n 2 ),然后用O(m)中的矩阵填充,其中n是顶点的数量和m是边的数量 - 然后矩阵被转发到Python层,在那里它被转换为Matrix对象,并且Python层不知道矩阵本质上是稀疏的,所以需要O(n转换它,在我的笔记本电脑上,为3000个节点的图形创建邻接矩阵大约500毫秒,我认为这可能是正常的。
是的,有一种方法可以立即从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)))
此版本在我的机器上将〜26毫秒内的相同图形转换为SciPy稀疏矩阵。