根据x、y坐标范围提取NetworkX子图的最高效方法是什么?
NetworkX按坐标范围提取子图方案
你不需要先通过list(zip(*graph.nodes(data = "pos")))提取所有坐标再校验,有更简洁直接的实现方式:
直接在遍历节点的同时获取坐标属性做筛选,再调用NetworkX内置的subgraph方法生成子图即可,示例代码如下:
# 定义你的坐标范围 x_range = (min_x, max_x) y_range = (min_y, max_y) # 筛选符合坐标要求的节点 selected_nodes = [ node for node, (x, y) in G.nodes(data="pos") if x_range[0] <= x <= x_range[1] and y_range[0] <= y <= y_range[1] ] # 生成子图,copy()会生成独立的新图,保留原节点、边的所有属性 sub_graph = G.subgraph(selected_nodes).copy()
这个方案的优势:
- 省去了额外的坐标提取、拆包转换步骤,逻辑更直观易维护
- 内置的
subgraph方法会自动保留符合条件的节点之间的原有边,不需要你手动校验边的归属关系 - 生成的子图会自动继承原节点的
pos等所有属性,不需要额外赋值
如果你有特殊需求需要保留一端在范围内的跨边界边,只需要先拿到选中节点的所有关联边,再把边的另一端节点也加入筛选列表即可,常规的区域裁剪子图场景用上述代码即可满足。
内容的提问来源于stack exchange,提问作者baxbear
相关产品推荐
相关产品推荐

