如何使用点数组和边数组创建一个邻接矩阵,Python

时间:2016-12-15 14:10:50

标签: python graph

我有一个图像,我收集了一些点,这些点代表了我的图表中代表顶点的区域的质心。 我的积分列表如下:

[(455, 472), (343, 472), (208, 471), (478, 456), (460, 441), (428, 439), 
 (413, 458), (48, 439), (107, 460), (130, 413), (179, 385), (250, 396), 
 (20, 373), (431, 381), (483, 355), (342, 390), (441, 343), (312, 344), 
 (283, 336), (259, 342), (409, 329),..............................]

现在我寻找一些边缘,在我的代码中做一些操作会生成这种类型的(p1,p2)列表,其中p1 ---- p2是一个边缘:

[((343, 472), (342, 390)), ((343, 472), (312, 344)), 
 ((343, 472), (337, 302)), ((478, 456), (460, 441)),...................]

现在我想实现一些算法,比如Dijksra或BFS。 查看其他SO问题和实现,我注意到大多数图表都表示为邻接矩阵。 我想的不是像我一样添加边缘,而是将它们直接添加到哈希表或字典对象中。问题是 - 我给出了一个顶点的名字是什么?假设我有(343,472),我不明白该如何去做一个看起来像这样的字典:{A : [p1,p2...], B: [p3,....], ... }

这样做的好方法是什么?我添加了一个代码,显示我如何创建边缘表示:

def makeEdgesFromSpots(centroids, imageForEdges):
edges = []
for c1 in centroids:
    for c2 in centroids:
        if(c1[0] == c2[0] and c1[1] == c2[1]):
            continue
        else:
            //checkPointsForPath does some testing, 
           //  to check if I want these points as an edge.
            isLine = checkPointsForPath(c1,c2,imageForEdges)
            if isLine == True:
                edges.append((c1,c2))
return edges

1 个答案:

答案 0 :(得分:0)

如果您的图表未加权且没有多边距,则可以使用defaultdict set值:

from collections import defaultdict
import pprint

edges = [((343, 472), (342, 390)), ((343, 472), (312, 344)),
         ((343, 472), (337, 302)), ((478, 456), (460, 441))]
adj_matrix = defaultdict(set)

for x, y in edges:
    adj_matrix[x].add(y)
    adj_matrix[y].add(x) # Assuming undirected graph

pprint.pprint(adj_matrix)

输出:

defaultdict(<class 'set'>,
            {(312, 344): {(343, 472)},
             (337, 302): {(343, 472)},
             (342, 390): {(343, 472)},
             (343, 472): {(312, 344), (337, 302), (342, 390)},
             (460, 441): {(478, 456)},
             (478, 456): {(460, 441)}})

除非您出于特定目的明确需要名称,否则无需命名顶点。