用Python的NetworkX从关联矩阵创建图

3

我有一个关联矩阵,其中行是节点,列是边(从文本文件读入NumPy数组):

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

我想使用NetworkX从这个矩阵创建一个图,但是找不到如何做到这一点。 NetworkX的from_numpy_matrix仅适用于邻接矩阵。 这里有一个使用NetworkX创建关联矩阵的好例子(但这不是我的情况,因为我已经有了一个关联矩阵)。 我也尝试过这个, 但是出现了错误:
File "C:\Python27\lib\site-packages\networkx\convert.py", line 150, in to_networkx_graph
    "Input is not a correct numpy matrix or array.")
networkx.exception.NetworkXError: Input is not a correct numpy matrix or array.

这似乎是一个简单的问题,但也许并不是。有人可以帮我吗?

提前致谢!

1个回答

8

Networkx拥有一个方便的nx.from_numpy_matrix函数,它可以接受邻接矩阵作为输入参数。因此,一旦我们将关联矩阵转换为邻接矩阵,就可以使用该函数。

假设我们现在有一个关联矩阵:

im = np.array([[0, 1, 1], [0, 1, 1], [0, 0, 0]])

要将它转换为邻接矩阵,首先让我们看一下哪些节点是连接的:

am = (np.dot(im, im.T) > 0).astype(int)

在这里,我们只是检查是否有至少一条边连接了任意两个节点。

如果您想删除自环,可以调用

np.fill_diagonal(am, 0)

现在让我们看一下 am

>>> am
array([[0, 1, 0],
       [1, 0, 0],
       [0, 0, 0]])

为了创建图形,现在我们只需要调用:
networkx.from_numpy_matrix(am)

谢谢,@Ami Tavory!它运行得非常好。将原矩阵转置以创建邻接矩阵的技巧非常棒。最好的祝愿。 - maurobio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接