繁体   English   中英

如何将节点和边的列表转换为邻接矩阵?

[英]How to convert a list of nodes and edges to an adjacency matrix?

我正在构建一个 Dash 应用程序,包括dash_cytoscape ,用户可以在其中连接和断开给定网络中的节点。 现在我想编写一个函数,从该网络的边和节点列表中重建邻接矩阵。 在 StackOverflow 上找到了这个线程,它大致朝着正确的方向发展,除了我的情况似乎是这个问题的边缘情况,其中并非每个节点都必须连接到另一个节点。 例如,网络可能如下所示:

在此处输入图片说明

该网络的正确邻接矩阵可能如下所示:

A = np.array([[0,1,0,0,0],
              [1,0,0,0,0],
              [0,0,0,0,0],
              [0,0,0,0,2],
              [0,0,0,2,0]])

我能够从网络中获取节点和边的列表:

edges = [('3', '4', 2),('0', '1', 1)]
nodes = ['0', '1', '2', '3', '4']

但是如何从那里到达正确的邻接矩阵呢?

您只需要创建一个大小为V x V的矩阵M ,其中V是您的节点总数,并用零填充它。 然后对于edges列表中的每个元素(例如(i, j, w) ),您知道i, j是要在邻接矩阵中修改的索引。 因此只需设置M[i, j] = w

注意:如果您的图是无向图,请记住从节点 i 到节点 j 的边与从节点 j 到节点 i 的边相同,因此您还必须设置M[j,i]=w

您可以遍历edges并使用权重更新预先填充的列表:

edges = [('3', '4', 2),('0', '1', 1)]
nodes = ['0', '1', '2', '3', '4']
m = max(map(int, nodes))
d = [[0 for _ in range(m+1)] for _ in range(m+1)]
for x, y, w in edges:
   d[int(x)][int(y)] = w
   d[int(y)][int(x)] = w

输出:

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

根据用户Fonzie的建议:

n_nodes = len(nodes)
A = np.zeros((n_nodes,n_nodes))

for edge in edges:
    i = int(edge[0])
    j = int(edge[1])
    weight = edge[2]
    A[i,j] = weight
    A[j,i] = weight

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM