news 2026/6/26 13:58:04

python之知识图谱(networkx)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python之知识图谱(networkx)

NetworkX 库介绍与使用指南

NetworkX 是 Python 中用于创建、操作和分析复杂网络(图结构)的核心库,支持无向图、有向图、加权图、多重图等多种图类型,内置丰富的图算法(路径分析、连通性、中心性、社区检测等),广泛应用于社交网络分析、网络拓扑研究、路径规划等场景。

一、安装

使用pip安装最新版本:

pipinstallnetworkx# 基础安装pipinstallnetworkx[all]# 包含所有依赖(如可视化、算法扩展)

验证安装:我使用的版本是 3.6.1

importnetworkxasnxprint(nx.__version__)# 输出版本号,如 3.2.1

二、核心概念

概念说明
节点(Node)图的基本单元,可绑定任意可哈希对象(整数、字符串、元组、自定义对象等)
边(Edge)连接节点的关系,可绑定属性(如权重、标签、时间戳)
图类型-Graph:无向图(默认),无自环/多重边
-DiGraph:有向图
-MultiGraph:无向多重图(允许多条边连同一对节点)
-MultiDiGraph:有向多重图

三、基础操作:创建与编辑图

1. 创建图

初始化不同类型的图:

# 1. 无向图(默认)G=nx.Graph()# 2. 有向图DG=nx.DiGraph()# 3. 无向多重图(允许多条边连接同一节点对)MG=nx.MultiGraph()# 4. 有向多重图MDG=nx.MultiDiGraph()
2. 添加节点
  • 单个节点:add_node()
  • 多个节点:add_nodes_from()
  • 带属性的节点(如节点名称、权重):
# 添加单个节点G.add_node(1)# 节点为整数G.add_node("A",weight=0.8,label="核心节点")# 节点为字符串,带属性# 添加多个节点(可迭代对象)G.add_nodes_from([2,3,4])# 批量添加带属性的节点G.add_nodes_from([(5,{"weight":0.5,"label":"普通节点"}),(6,{"weight":0.3})])# 从另一个图导入节点G2=nx.Graph()G2.add_nodes_from(G.nodes)# 复制G的所有节点
3. 添加边
  • 单个边:add_edge()
  • 多个边:add_edges_from()
  • 带权重/属性的边:
# 添加单个边(连接节点1和2)G.add_edge(1,2)# 带权重的边G.add_edge(2,3,weight=5.0,label="强连接")# 添加多个边(列表形式,每个元素为(节点u, 节点v)或(节点u, 节点v, 属性字典))G.add_edges_from([(3,4),(4,5,{"weight":2.0}),(5,6,{"weight":1.0,"label":"弱连接"})])# 多重图添加多条边(同一节点对)MG.add_edge(1,2,key=0,weight=1.0)# key区分同节点对的不同边MG.add_edge(1,2,key=1,weight=2.0)
4. 删除节点/边
# 删除单个节点G.remove_node(6)# 删除多个节点G.remove_nodes_from([4,5])# 删除单个边G.remove_edge(1,2)# 删除多个边G.remove_edges_from([(2,3),(3,4)])# 清空所有节点/边G.clear()
5. 查询图信息
# 1. 节点相关print("所有节点:",list(G.nodes))# 输出节点列表print("节点数量:",G.number_of_nodes())# 输出节点数print("节点1的属性:",G.nodes[1])# 获取节点1的属性(需先添加属性)# 2. 边相关print("所有边:",list(G.edges))# 输出边列表print("边数量:",G.number_of_edges())# 输出边数print("边(2,3)的属性:",G.edges[2,3])# 获取边(2,3)的属性# 3. 邻接节点(与指定节点相连的节点)print("节点2的邻接节点:",list(G.neighbors(2)))# 4. 图的基本信息n_nodes=G.number_of_nodes()n_edges=G.number_of_edges()avg_degree=2*n_edges/n_nodes# 无向图平均度计算方式print(f"图的摘要:节点数={n_nodes}, 边数={n_edges}, 平均度={avg_degree:.2f}")

四、图分析:常用算法与指标

NetworkX 内置大量图分析算法,以下是高频使用场景:

1. 度(Degree)分析

度表示节点的边数,有向图区分入度(in_degree)出度(out_degree)

# 无向图:节点的度print("节点2的度:",G.degree[2])# 带权重的度(求和所有边的权重)print("节点2的加权度:",G.degree(2,weight="weight"))# 有向图:入度/出度DG.add_edges_from([(1,2),(2,3),(3,2)])print("节点2的入度:",DG.in_degree[2])# 2(1→2、3→2)print("节点2的出度:",DG.out_degree[2])# 1(2→3)
2. 路径分析
  • 最短路径(无权重/加权):
# 重置图(确保可运行)G=nx.Graph()G.add_edges_from([(1,2,{"weight":1}),(2,3,{"weight":5}),(1,3,{"weight":10}),(3,4,{"weight":2})])# 1. 无权重最短路径(节点数最少)shortest_path=nx.shortest_path(G,source=1,target=4)print("无权重最短路径:",shortest_path)# [1,2,3,4]# 2. 加权最短路径(Dijkstra算法)weighted_shortest_path=nx.shortest_path(G,source=1,target=4,weight="weight")print("加权最短路径:",weighted_shortest_path)# [1,2,3,4]# 加权最短路径长度path_length=nx.shortest_path_length(G,source=1,target=4,weight="weight")print("加权路径长度:",path_length)# 1+5+2=8
3. 连通性分析
  • 无向图:连通分量(子图内任意节点可达)
  • 有向图:强连通分量(双向可达)/弱连通分量(忽略方向后可达)
# 无向图连通分量G3=nx.Graph()G3.add_edges_from([(1,2),(3,4),(4,5)])components=list(nx.connected_components(G3))print("连通分量:",components)# [{1,2}, {3,4,5}]# 有向图强连通分量DG3=nx.DiGraph()DG3.add_edges_from([(1,2),(2,1),(2,3),(3,4)])strong_components=list(nx.strongly_connected_components(DG3))print("强连通分量:",strong_components)# [{1,2}, {3}, {4}]
4. 节点中心性(衡量节点重要性)
中心性类型说明函数
度中心性节点度占总节点数的比例nx.degree_centrality()
介数中心性节点出现在最短路径的比例nx.betweenness_centrality()
接近中心性节点到其他节点的平均距离nx.closeness_centrality()

示例:

# 计算度中心性degree_centrality=nx.degree_centrality(G)print("度中心性:",degree_centrality)# {1:0.333, 2:0.666, 3:0.666, 4:0.333}# 计算介数中心性(加权)betweenness=nx.betweenness_centrality(G,weight="weight")print("介数中心性:",betweenness)

五、图的可视化

NetworkX 结合 Matplotlib 实现可视化,支持自定义节点/边样式:

基础可视化
importmatplotlib.pyplotasplt# 重置示例图G=nx.Graph()G.add_edges_from([(1,2,{"weight":1}),(2,3,{"weight":5}),(1,3,{"weight":10}),(3,4,{"weight":2})])# 1. 基础布局(spring_layout:力导向布局,模拟物理引力)pos=nx.spring_layout(G)# 计算节点位置# 2. 绘制节点(自定义大小、颜色)nx.draw_networkx_nodes(G,pos,node_size=800,node_color="lightblue")# 3. 绘制边(自定义宽度:根据权重缩放)edge_weights=[G[u][v]["weight"]foru,vinG.edges]nx.draw_networkx_edges(G,pos,width=[w*0.5forwinedge_weights],edge_color="gray")# 4. 绘制节点标签、边权重nx.draw_networkx_labels(G,pos,font_size=12)nx.draw_networkx_edge_labels(G,pos,edge_labels={(u,v):G[u][v]["weight"]foru,vinG.edges})# 5. 隐藏坐标轴plt.axis("off")plt.title("加权无向图可视化")plt.show()
常用布局
布局函数适用场景
spring_layout()通用力导向布局(最常用)
circular_layout()节点环形排列
random_layout()节点随机排列
kamada_kawai_layout()优化节点间距离,更美观
shell_layout()节点分层排列(如社交网络层级)

六、综合示例:社交网络分析

# 1. 创建社交网络(无向图)social_graph=nx.Graph()# 2. 添加节点(用户),带属性(年龄、性别)social_graph.add_nodes_from([("Alice",{"age":25,"gender":"F"}),("Bob",{"age":30,"gender":"M"}),("Charlie",{"age":28,"gender":"M"}),("Diana",{"age":26,"gender":"F"}),("Eve",{"age":27,"gender":"F"})])# 3. 添加边(好友关系),带权重(亲密度1-10)social_graph.add_edges_from([("Alice","Bob",{"intimacy":9}),("Alice","Charlie",{"intimacy":6}),("Bob","Diana",{"intimacy":8}),("Charlie","Diana",{"intimacy":5}),("Diana","Eve",{"intimacy":7}),("Alice","Eve",{"intimacy":4})])# 4. 分析:# (1) 每个用户的好友数(度)print("=== 好友数 ===")foruserinsocial_graph.nodes:print(f"{user}:{social_graph.degree[user]}个好友")# (2) 亲密度加权的度中心性print("\n=== 亲密度中心性 ===")intimacy_centrality=nx.degree_centrality(social_graph,weight="intimacy")foruser,scoreinintimacy_centrality.items():print(f"{user}:{score:.2f}")# (3) Alice到Eve的最短路径(按亲密度加权)print("\n=== Alice到Eve的最短路径 ===")path=nx.shortest_path(social_graph,source="Alice",target="Eve",weight="intimacy")path_length=nx.shortest_path_length(social_graph,source="Alice",target="Eve",weight="intimacy")print(f"路径:{' → '.join(path)},总亲密度:{path_length}")# (4) 可视化pos=nx.kamada_kawai_layout(social_graph)nx.draw_networkx_nodes(social_graph,pos,node_size=1000,node_color=["pink"ifsocial_graph.nodes[n]["gender"]=="F"else"lightblue"forninsocial_graph.nodes])nx.draw_networkx_edges(social_graph,pos,width=[e["intimacy"]*0.3foru,v,einsocial_graph.edges(data=True)])nx.draw_networkx_labels(social_graph,pos,font_size=12)nx.draw_networkx_edge_labels(social_graph,pos,edge_labels={(u,v):e["intimacy"]foru,v,einsocial_graph.edges(data=True)})plt.axis("off")plt.title("社交网络亲密度分析")plt.show()

七、进阶扩展

  1. 读取/保存图:支持 GraphML、GEXF、Pajek 等格式:
    # 保存为GraphMLnx.write_graphml(G,"my_graph.graphml")# 读取GraphMLG_loaded=nx.read_graphml("my_graph.graphml")
  2. 社区检测:使用nx.community模块(如 Louvain 算法):
    fromnetworkx.algorithmsimportcommunity communities=community.louvain_communities(G,weight="weight")
  3. 与其他库结合
    • 高性能计算:结合igraph/graph-tool(处理大规模图);
    • 可视化增强:结合Pyvis(交互式可视化)、Plotly(动态图)。

总结

NetworkX 是 Python 图分析的入门与核心工具,优势在于易用性强、API 直观、内置算法丰富,适合中小规模图(百万节点以内)的分析;若需处理超大规模图,可结合Dask分布式计算或专用图数据库(如 Neo4j)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 22:46:09

自动泊车车位检测及改进混合a星算法的路径规划,其中包括环境地图建模,路径规划及优化程序。 。 ...

自动泊车车位检测及改进混合a星算法的路径规划,其中包括环境地图建模,路径规划及优化程序。 。 。 平行垂直斜向都有,自动泊车的技术栈里有两个硬骨头:怎么在混乱的停车场精准找到车位,以及如何生成一条让车子能倒进去…

作者头像 李华
网站建设 2026/6/25 8:11:39

Waymo时序数据完整序列访问的3步实战指南

Waymo时序数据完整序列访问的3步实战指南 【免费下载链接】waymo-open-dataset Waymo Open Dataset 项目地址: https://gitcode.com/gh_mirrors/wa/waymo-open-dataset 如何从单帧数据快速构建完整时序序列?这是许多自动驾驶开发者在处理Waymo Open Dataset时…

作者头像 李华
网站建设 2026/6/25 11:59:22

终极指南:DBeaver SQL编辑器代码模板功能快速上手

终极指南:DBeaver SQL编辑器代码模板功能快速上手 【免费下载链接】dbeaver 项目地址: https://gitcode.com/gh_mirrors/dbe/dbeaver DBeaver作为一款强大的开源数据库管理工具,其SQL编辑器的代码模板功能为开发者提供了极大的便利。特别是模板变…

作者头像 李华
网站建设 2026/6/25 17:39:41

企业AI智能体的技术架构与实施路径:从概念到落地的关键技术实践

一、企业AI智能体的技术架构解析企业级AI智能体并非单一技术模块,而是由多层级架构协同构成的复杂系统。典型的技术架构可分为感知层、认知层、决策层与执行层,其核心能力取决于各层的技术耦合度与扩展性。1. 感知层:多模态交互入口输入模块&…

作者头像 李华
网站建设 2026/6/25 6:52:12

5分钟掌握分布式PPO:7倍加速强化学习训练终极方案

你是否正在为PPO算法训练耗时过长而苦恼?传统单环境训练模式下,一个简单的CartPole任务可能需要数小时才能收敛。本文将从性能瓶颈深度剖析入手,为你呈现一套完整的分布式训练架构设计方案,通过多进程环境并行技术实现PPO算法7倍性…

作者头像 李华
网站建设 2026/6/25 18:23:17

智能运维的“地基革命”:数据治理如何支撑大模型智能体?

岁末回望智能运维领域,大模型智能体正重塑运维格局,智能运维建设从基于小模型统计分析算法的1.0时代进入基于大、小模型融合智能体驱动的2.0时代。热潮之下,擎创科技始终保持清醒洞察:行业存在一个易被忽视的核心迷思—不少企业过…

作者头像 李华