如何使用NetworkX创建含对角连接的二维网格图?
如何使用NetworkX创建含对角连接的二维网格图?
嘿,我完全懂你的需求啦!你要的是八邻接网格图——也就是不仅上下左右的节点相连,对角线方向的节点也要互相连通,而NetworkX默认的grid_2d_graph只支持四邻接(仅上下左右)。下面我给你一步步演示怎么实现:
先把你的网格和对应坐标对应起来,方便后续操作:
| 坐标 | 字母 | 坐标 | 字母 | 坐标 | 字母 |
|---|---|---|---|---|---|
| (0,0) | A | (0,1) | B | (0,2) | C |
| (1,0) | L | (1,1) | M | (1,2) | N |
| (2,0) | X | (2,1) | Y | (2,2) | Z |
步骤1:导入NetworkX并创建基础四邻接图
先基于你的3行3列网格,创建一个基础的四邻接图:
import networkx as nx # 定义网格的行数和列数 rows, cols = 3, 3 # 创建基础四邻接网格图(默认只连上下左右) G = nx.grid_2d_graph(rows, cols)
步骤2:添加对角线连接的边
接下来手动补充对角线的边,让每个节点和它的对角邻居连通:
# 遍历所有节点的坐标 for i in range(rows): for j in range(cols): # 连接右下方向的对角节点 (i+1, j+1) if i + 1 < rows and j + 1 < cols: G.add_edge((i, j), (i+1, j+1)) # 连接左下方向的对角节点 (i+1, j-1) if i + 1 < rows and j - 1 >= 0: G.add_edge((i, j), (i+1, j-1))
步骤3:把坐标节点替换成你的字母标签
现在图里的节点是坐标格式,我们用你的dx_grid把节点重命名为对应的字母:
dx_grid = [["A", "B", "C"], ["L", "M", "N"], ["X", "Y", "Z"]] # 创建坐标到字母的映射字典 label_mapping = {(i, j): dx_grid[i][j] for i in range(rows) for j in range(cols)} # 重命名图中的节点 G = nx.relabel_nodes(G, label_mapping)
验证效果
你可以检查节点M的邻居,现在它应该包含所有8个方向的节点:
print(list(G.neighbors("M"))) # 输出:['B', 'L', 'N', 'Y', 'A', 'C', 'X', 'Z']
如果想直观看到图的结构,还可以用matplotlib可视化:
import matplotlib.pyplot as plt nx.draw(G, with_labels=True, node_size=1500, font_size=12, node_color="#f0f0f0") plt.show()
这样就完全实现你想要的带对角线连接的网格图啦!
备注:内容来源于stack exchange,提问作者blackthorne18
相关产品推荐
相关产品推荐

