如何基于给定点列表用NetworkX创建带边权重的二维网格图
二维网格图生成与边权重设置解决方案
原有实现问题说明
你之前的代码存在两个核心问题:
nx.generators.lattice.grid_2d_graph接收的是整数类型的行列数参数m、n,不是坐标点集合,传参格式不符合接口要求会导致生成结果异常。- 未固定随机种子的情况下,每次调用
random.uniform生成的坐标都会变化,会出现同参数运行结果不一致的问题。
实现逻辑
- 坐标映射逻辑:你调用生成点的方法传入参数n时,会生成n个x轴坐标、n个y轴坐标,笛卡尔积后得到的n²个坐标,刚好对应n行n列的二维网格,第i行第j列的网格节点对应坐标为
(x[i], y[j])。 - 生成网格图并绑定节点坐标属性。
- 遍历所有边计算欧氏距离作为边权重。
完整代码示例
import random import itertools import networkx as nx import math # 固定随机种子,保证每次运行生成的坐标一致,不需要复现结果可删除 random.seed(42) def generate_points(n): """Generates n points whose values are in the range (0, 1). Args: n (int): number of points to generate """ x = [random.uniform(0, 1) for r in range(n)] y = [random.uniform(0, 1) for r in range(n)] return x, y, list(itertools.product(x, y)) # 定义网格行列数,可自行调整 grid_size = 5 x_list, y_list, all_coords = generate_points(grid_size) # 生成二维网格图 G = nx.generators.lattice.grid_2d_graph(m=grid_size, n=grid_size) # 给节点绑定实际坐标属性 for (i, j) in G.nodes: G.nodes[(i, j)]["coord"] = (x_list[i], y_list[j]) # 计算每条边的欧氏距离作为权重 for u, v in G.edges: x1, y1 = G.nodes[u]["coord"] x2, y2 = G.nodes[v]["coord"] euclidean_dist = math.sqrt((x1 - x2)**2 + (y1 - y2)**2) G.edges[(u, v)]["weight"] = euclidean_dist # 测试验证代码 test_node = (0, 0) print(f"节点{test_node}的实际坐标:{G.nodes[test_node]['coord']}") test_edge = list(G.edges)[0] print(f"边{test_edge}的欧氏距离权重:{G.edges[test_edge]['weight']:.4f}")
补充说明
如果需要直接使用坐标值作为节点ID,而非行列索引,可在生成图后执行节点重映射:
# 节点映射规则:行列索引 -> 实际坐标 mapping = {node: G.nodes[node]["coord"] for node in G.nodes} G = nx.relabel_nodes(G, mapping)
内容的提问来源于stack exchange,提问作者AndW
相关产品推荐
相关产品推荐

