将 python-igraph 图转换为 networkx
Convert python-igraph graph to networkx
最近我一直在使用 python-igraph 包,我的所有代码都基于我使用 igraph 创建的图表。现在,我需要为我的图形计算一些度量,这些度量显然是在 networkx 中实现的,而不是在 igraph 中实现的,例如 (katz_centrality_numpy、edge_betweenness_centrality、...)。我想知道是否有办法在这两个包之间将一个图转换为另一个图,并避免再次读取文件,因为我的文件很大并且必须重复很多相同的过程。
顺便说一下,当我将 igraph 图传递给 networkx 函数时,我收到以下错误:
TypeError: 'Graph' object is not iterable
谢谢:)
您可以启动带边的 networkx 图:
Graph([(1,2), (3,4)])
编辑:
这是使用方法(感谢 nimafl 提供的代码):
graph
是 igraph
图,我们创建 G
这是一个 networkx
图。
import networkx
A = graph.get_edgelist()
G = networkx.DiGraph(A) # In case your graph is directed
G = networkx.Graph(A) # In case you graph is undirected
好的,所以我自己想出来了。这是你应该做的。假设您的 python.igraph 对象称为图形,我们创建一个名为 G 的 networkx 图形如下:
import networkx as netx
A = [edge.tuple for edge in graph.es]
# In case your graph is directed
G = netx.DiGraph(A)
# In case you graph is undirected
G = netx.Graph(A)
graph.es returns 图边列表,然后将它们全部添加到 A 并使用矩阵 A 在 networkx 中创建一个图。
祝您代码顺利:)
当我尝试在 igraph 或 nx 上存储 nodes/edges 的名称时,这是我的单行版本,它在从 igraph 对象 g
传输到 nx 时也传输节点名称, G、结果:
G = nx.from_edgelist([(names[x[0]], names[x[1]])
for names in [g.vs['name']] # simply a let
for x in g.get_edgelist()], nx.DiGraph())
此外,如果您需要相反的方法,请查看 this answer。
最佳答案很好,但以防万一需要保留节点的顺序(以便对 mNgraph.nodes
进行排序),并且 igraph.Graph 没有节点名称,请考虑使用像
mNgraph = networkx.Graph()
mNgraph.add_nodes_from(range(mIgraph.vcount()))
mNgraph.add_edges_from(mIgraph.get_edgelist())
最近我一直在使用 python-igraph 包,我的所有代码都基于我使用 igraph 创建的图表。现在,我需要为我的图形计算一些度量,这些度量显然是在 networkx 中实现的,而不是在 igraph 中实现的,例如 (katz_centrality_numpy、edge_betweenness_centrality、...)。我想知道是否有办法在这两个包之间将一个图转换为另一个图,并避免再次读取文件,因为我的文件很大并且必须重复很多相同的过程。
顺便说一下,当我将 igraph 图传递给 networkx 函数时,我收到以下错误:
TypeError: 'Graph' object is not iterable
谢谢:)
您可以启动带边的 networkx 图:
Graph([(1,2), (3,4)])
编辑:
这是使用方法(感谢 nimafl 提供的代码):
graph
是 igraph
图,我们创建 G
这是一个 networkx
图。
import networkx
A = graph.get_edgelist()
G = networkx.DiGraph(A) # In case your graph is directed
G = networkx.Graph(A) # In case you graph is undirected
好的,所以我自己想出来了。这是你应该做的。假设您的 python.igraph 对象称为图形,我们创建一个名为 G 的 networkx 图形如下:
import networkx as netx
A = [edge.tuple for edge in graph.es]
# In case your graph is directed
G = netx.DiGraph(A)
# In case you graph is undirected
G = netx.Graph(A)
graph.es returns 图边列表,然后将它们全部添加到 A 并使用矩阵 A 在 networkx 中创建一个图。
祝您代码顺利:)
当我尝试在 igraph 或 nx 上存储 nodes/edges 的名称时,这是我的单行版本,它在从 igraph 对象 g
传输到 nx 时也传输节点名称, G、结果:
G = nx.from_edgelist([(names[x[0]], names[x[1]])
for names in [g.vs['name']] # simply a let
for x in g.get_edgelist()], nx.DiGraph())
此外,如果您需要相反的方法,请查看 this answer。
最佳答案很好,但以防万一需要保留节点的顺序(以便对 mNgraph.nodes
进行排序),并且 igraph.Graph 没有节点名称,请考虑使用像
mNgraph = networkx.Graph()
mNgraph.add_nodes_from(range(mIgraph.vcount()))
mNgraph.add_edges_from(mIgraph.get_edgelist())