Networkx:在新变量中删节点不影响原图,批量生成子图
基于初始Watts-Strogatz图生成子图的完整实现
看起来你想要基于一个初始的环形Watts-Strogatz图(当p=0时,这个图本质就是100个节点的环形图),生成40个节点数更少的子图,每次迭代指定要删除的节点数量和对应索引。我来给你补全并优化这段代码,确保它能稳定运行:
import networkx as nx import numpy as np # 生成初始原图(p=0时为100节点的环形无向图) original_G = nx.watts_strogatz_graph(100, 2, 0) number_examples = 40 # 用于存储所有生成的子图 subgraph_collection = [] for i in range(number_examples): # 示例:随机指定本次要删除的节点数量(范围1-10,可根据需求调整) # 如果你有预先定义的删除数量列表,直接替换成你的自定义数据即可 num_remove = np.random.randint(1, 11) # 从原图节点中随机挑选对应数量的节点索引(无重复) # NetworkX默认节点为0开始的整数,直接选索引即可 nodes_to_remove = np.random.choice(original_G.nodes, size=num_remove, replace=False) # 必须创建原图副本!避免修改原始图影响后续迭代 current_subgraph = original_G.copy() # 删除指定节点,关联的边会被自动移除 current_subgraph.remove_nodes_from(nodes_to_remove) # 将生成的子图存入集合 subgraph_collection.append(current_subgraph) # 可选:打印验证信息 print(f"生成第{i+1}个子图,剩余节点数:{current_subgraph.number_of_nodes()}")
关键细节说明
- 保护原始图:每次生成子图前一定要用
copy()创建副本,否则删除节点会直接修改原始图,导致后续所有迭代都基于已修改的图执行,结果完全错误。 - 自定义删除规则:如果你的需求不是随机删除,而是有预先指定的删除数量和节点索引,只需要替换随机生成的部分:
# 假设你有预先定义好的参数列表 predefined_remove_counts = [5, 3, 7, ...] # 共40个元素 predefined_node_lists = [[1,3,5,7,9], [2,4,6], [10,12,14,16,18,20,22], ...] # 共40个列表 for i in range(number_examples): num_remove = predefined_remove_counts[i] nodes_to_remove = predefined_node_lists[i] # 后续步骤与上述代码一致 - 子图有效性验证:可以通过
current_subgraph.number_of_edges()、nx.is_connected(current_subgraph)等方法,验证子图的边数、连通性是否符合预期。
如果你的需求还有特殊约束(比如删除后必须保证子图连通,或者有特定的节点选择逻辑),可以随时补充说明,我再帮你调整代码~
内容的提问来源于stack exchange,提问作者eric lardon
相关产品推荐
相关产品推荐

