如何基于CSV文件批量计算图中节点间的共同邻居?
问题分析与解决方案
你的代码存在三个核心问题,导致无法正确计算所有节点对的共同邻居:
- 节点读取错误:
G.add_nodes_from("n")是将字符串"n"拆分为单个字符('n')添加为节点,而非读取CSV文件里的实际节点数据。 - 边读取错误:
G.add_edges_from([("u","v")])仅添加了一条名为"u"和"v"的节点间的边,没有导入CSV中的真实边数据。 - 未遍历所有节点对:仅针对不存在的节点对("u","v")计算共同邻居,没有覆盖所有需要计算的节点组合。
修正后的完整代码
import networkx as nx import pandas as pd from itertools import combinations # 读取CSV数据 nodes_df = pd.read_csv("vectorcornell.csv", names=["n"]) edges_df = pd.read_csv("edgescornell.csv", names=["u", "v"]) # 构建图结构 G = nx.Graph() # 从CSV的节点列添加所有节点 G.add_nodes_from(nodes_df["n"].tolist()) # 将边数据转换为元组列表后添加 edges = edges_df.apply(tuple, axis=1).tolist() G.add_edges_from(edges) # 计算所有无序节点对的共同邻居 # 使用combinations生成不重复的节点对 for node1, node2 in combinations(G.nodes(), 2): common_neighbors = list(nx.common_neighbors(G, node1, node2)) # 可以选择只输出有共同邻居的节点对,避免空结果刷屏 if common_neighbors: print(f"节点{node1}和{node2}的共同邻居: {common_neighbors}") # 绘制图(可选,数据量大时不建议,会很拥挤) import matplotlib.pyplot as plt nx.draw(G, with_labels=True) plt.show()
关键修正说明
- 节点导入:
nodes_df["n"].tolist()将CSV中存储的所有节点编号转换为列表,正确添加到图中。 - 边导入:
edges_df.apply(tuple, axis=1).tolist()把CSV的每一行边数据转换为元组(比如(节点A, 节点B)),批量添加到图中。 - 遍历所有节点对:
combinations(G.nodes(), 2)生成所有不重复的无序节点对,确保每对节点只计算一次共同邻居。如果只需要计算有边相连的节点对,可以替换为G.edges()。
内容的提问来源于stack exchange,提问作者raghad
相关产品推荐
相关产品推荐

