You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于给定点列表用NetworkX创建带边权重的二维网格图

二维网格图生成与边权重设置解决方案

原有实现问题说明

你之前的代码存在两个核心问题:

  1. nx.generators.lattice.grid_2d_graph 接收的是整数类型的行列数参数m、n,不是坐标点集合,传参格式不符合接口要求会导致生成结果异常。
  2. 未固定随机种子的情况下,每次调用random.uniform生成的坐标都会变化,会出现同参数运行结果不一致的问题。

实现逻辑

  1. 坐标映射逻辑:你调用生成点的方法传入参数n时,会生成n个x轴坐标、n个y轴坐标,笛卡尔积后得到的n²个坐标,刚好对应n行n列的二维网格,第i行第j列的网格节点对应坐标为(x[i], y[j])。
  2. 生成网格图并绑定节点坐标属性。
  3. 遍历所有边计算欧氏距离作为边权重。

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:09:03