Python NetworkX从关联矩阵创建图形

时间:2016-09-15 12:34:09

标签: python networkx

我有一个关联矩阵(其中行是节点,列是边),如下所示(它从文本文件读取到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仅适用于邻接矩阵。 Here是如何使用NetworkX创建关联矩阵的一个很好的例子(但这不是我的情况,因为我已经开始使用关联矩阵)。我也尝试了this,但得到了一个令人讨厌的错误:

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 个答案:

答案 0 :(得分:7)

Networkx有一个方便的nx.from_numpy_matrix function采用邻接矩阵,所以一旦我们将关联矩阵转换为邻接矩阵,我们就会很好。

假设我们从关联矩阵

开始
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)