在 python-igraph 中获取有向图的邻接矩阵

get adjacency matrix of a directed graph in python-igraph

我的问题听起来可能很愚蠢,但是我怎样才能得到有向图的邻接矩阵呢?

让我解释一下。我有以下代码:

g = Graph()
g.add_vertices(5)
g.add_edges([(0,1),(1,2)])
print(g)
print(g.get_adjacency())

第一个打印returns:

IGRAPH U--- 5 2 --
+ edges:
0--1 1--2

而第二个 returns:

[[0, 1, 0, 0, 0]
 [1, 0, 1, 0, 0]
 [0, 1, 0, 0, 0]
 [0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0]]

如果我希望我的图是有向的而不是无向的怎么办?

感谢帮助

在开始向图形添加边之前,您需要按照指示初始化图形:

gd = Graph(directed=True)
gd.add_vertices(5)
gd.add_edges([(0,1),(1,2)])
print(gd.get_adjacency())
# [[0, 1, 0, 0, 0]
#  [0, 0, 1, 0, 0]
#  [0, 0, 0, 0, 0]
#  [0, 0, 0, 0, 0]
#  [0, 0, 0, 0, 0]]

Matthew 提到的 .to_directed() 方法不会执行您想要的操作,因为它会为每个无向边在两个方向上创建边:

print(g.is_directed())    # your original undirected example graph
# False

g.to_directed()

print(g.is_directed())
# True

print(g.get_adjacency())  # adjacency matrix is still symmetric
# [[0, 1, 0, 0, 0]
#  [1, 0, 1, 0, 0]
#  [0, 1, 0, 0, 0]
#  [0, 0, 0, 0, 0]
#  [0, 0, 0, 0, 0]]

您可以通过传递 .to_directed(mutual=False) 来防止创建两个有向边,但在这种情况下,igraph 只是为每个边选择一个任意的单一方向。根本问题是如果图是无向的,关于边方向的信息就不会被存储。