mcpField
N
networkx

networkx

github.com/kalarislabs其他7343 次安装4 天前更新
代码仓库

关于 networkx

NetworkX skill 为 Python 用户提供创建、操作和分析图与网络的指导,适用于处理社交、生物、交通和知识图谱等关系数据。内容涵盖常用算法、网络生成、文件读写及可视化,并针对 NetworkX 3.x。

主要功能

  1. 01创建和操作多种图结构
  2. 02计算路径与中心性指标
  3. 03检测社区和连通分量
  4. 04生成随机及结构化网络
  5. 05读写多种图数据格式
  6. 06绘制并自定义网络图

适用场景

  1. 01分析社交网络中的节点关系
  2. 02计算交通网络的最短路径
  3. 03生成模拟网络用于测试
  4. 04可视化并导出图分析结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill networkx

安装后在 Claude Code 中输入/networkx确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
algorithms.md
generators.md
graph-basics.md
io.md
visualization.md

详细介绍

NetworkX

概述

NetworkX 是一个 Python 包,用于创建、操作和分析复杂网络与图。在处理网络或图数据结构时使用此技能,包括社交网络、生物网络、交通系统、引文网络、知识图谱,或任何涉及实体间关系的系统。

此技能面向 NetworkX 3.x(当前稳定版本:3.6,要求 Python >= 3.11)。多个 3.0 之前的 API(nx.info、nx.write_gpickle、nx.read_shp)以及 3.4 时代的 nx.random_tree 已不复存在;此技能中均使用了当前的替代方案。

何时使用此技能

在任务涉及以下内容时调用此技能:

  • 创建图:根据数据构建网络结构,添加带属性的节点和边
  • 图分析:计算中心性指标、查找最短路径、检测社区、测量聚类
  • 图算法:运行 Dijkstra、PageRank、最小生成树、最大流等标准算法
  • 网络生成:创建合成网络(随机、无标度、小世界模型),用于测试或模拟
  • 图 I/O:读写各种格式(边列表、GraphML、JSON、CSV、邻接矩阵)
  • 可视化:使用 matplotlib 或交互式库绘制并自定义网络可视化图
  • 网络比较:检查同构性、计算图指标、分析结构属性

核心功能

1. 图的创建与操作

NetworkX 支持四种主要图类型:

  • Graph:具有单条边的无向图
  • DiGraph:具有单向连接的有向图
  • MultiGraph:允许节点之间存在多条边的无向图
  • MultiDiGraph:具有多条边的有向图

可通过以下方式创建图:

import networkx as nx

# Create empty graph
G = nx.Graph()

# Add nodes (can be any hashable type)
G.add_node(1)
G.add_nodes_from([2, 3, 4])
G.add_node("protein_A", type='enzyme', weight=1.5)

# Add edges
G.add_edge(1, 2)
G.add_edges_from([(1, 3), (2, 4)])
G.add_edge(1, 4, weight=0.8, relation='interacts')

参考:请参阅 references/graph-basics.md,了解创建、修改、检查和管理图结构的全面指南,包括属性和子图的使用。

2. 图算法

NetworkX 提供了丰富的网络分析算法:

最短路径:

# Find shortest path
path = nx.shortest_path(G, source=1, target=5)
length = nx.shortest_path_length(G, source=1, target=5, weight='weight')

中心性指标:

# Degree centrality
degree_cent = nx.degree_centrality(G)

# Betweenness centrality
betweenness = nx.betweenness_centrality(G)

# PageRank
pagerank = nx.pagerank(G)

社区检测:

from networkx.algorithms import community

# Detect communities
communities = community.greedy_modularity_communities(G)

连通性:

# Check connectivity
is_connected = nx.is_connected(G)

# Find connected components
components = list(nx.connected_components(G))

参考:请参阅 references/algorithms.md,了解所有可用算法的详细文档,包括最短路径、中心性指标、聚类、社区检测、流、匹配、树算法和图遍历。

3. 图生成器

创建合成网络,用于测试、模拟或建模:

经典图:

# Complete graph
G = nx.complete_graph(n=10)

# Cycle graph
G = nx.cycle_graph(n=20)

# Known graphs
G = nx.karate_club_graph()
G = nx.petersen_graph()

随机网络:

# Erdős-Rényi random graph
G = nx.erdos_renyi_graph(n=100, p=0.1, seed=42)

# Barabási-Albert scale-free network
G = nx.barabasi_albert_graph(n=100, m=3, seed=42)

# Watts-Strogatz small-world network
G = nx.watts_strogatz_graph(n=100, k=6, p=0.1, seed=42)

结构化网络:

# Grid graph
G = nx.grid_2d_graph(m=5, n=7)

# Random tree (random_tree was removed in NetworkX 3.4)
G = nx.random_labeled_tree(100, seed=42)

参考:请参阅 references/generators.md,全面了解所有图生成器,包括经典、随机、格、二分图和专用网络模型,以及详细参数和使用场景。

4. 图的读写

NetworkX 支持多种文件格式和数据源:

文件格式:

# Edge list
G = nx.read_edgelist('graph.edgelist')
nx.write_edgelist(G, 'graph.edgelist')

# GraphML (preserves attributes)
G = nx.read_graphml('graph.graphml')
nx.write_graphml(G, 'graph.graphml')

# GML
G = nx.read_gml('graph.gml')
nx.write_gml(G, 'graph.gml')

# JSON (node-link format; edge list is stored under the "edges" key
# since NetworkX 3.6 — older files may use "links", see references/io.md)
data = nx.node_link_data(G)
G = nx.node_link_graph(data)

Pandas 集成:

import pandas as pd

# From DataFrame
df = pd.DataFrame({'source': [1, 2, 3], 'target': [2, 3, 4], 'weight': [0.5, 1.0, 0.75]})
G = nx.from_pandas_edgelist(df, 'source', 'target', edge_attr='weight')

# To DataFrame
df = nx.to_pandas_edgelist(G)

矩阵格式:

import numpy as np

# Adjacency matrix
A = nx.to_numpy_array(G)
G = nx.from_numpy_array(A)

# Sparse matrix
A = nx.to_scipy_sparse_array(G)
G = nx.from_scipy_sparse_array(A)

参考:请参阅 references/io.md,了解所有 I/O 格式的完整文档,包括 CSV、SQL 数据库、Cytoscape、DOT,以及针对不同使用场景选择格式的指南。

5. 可视化

创建清晰且信息丰富的网络可视化图:

基础可视化:

import matplotlib.pyplot as plt

# Simple draw
nx.draw(G, with_labels=True)
plt.show()

# With layout
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos=pos, with_labels=True, node_color='lightblue', node_size=500)
plt.show()

自定义:

# Color by degree
node_colors = [G.degree(n) for n in G.nodes()]
nx.draw(G, node_color=node_colors, cmap=plt.cm.viridis)

# Size by centrality
centrality = nx.betweenness_centrality(G)
node_sizes = [3000 * centrality[n] for n in G.nodes()]
nx.draw(G, node_size=node_sizes)

# Edge weights
edge_widths = [3 * G[u][v].get('weight', 1) for u, v in G.edges()]
nx.draw(G, width=edge_widths)

布局算法:

# Spring layout (force-directed)
pos = nx.spring_layout(G, seed=42)

# Circular layout
pos = nx.circular_layout(G)

# Kamada-Kawai layout
pos = nx.kamada_kawai_layout(G)

# Spectral layout
pos = nx.spectral_layout(G)

出版级质量:

plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos=pos, node_color='lightblue', node_size=500,
        edge_color='gray', with_labels=True, font_size=10)
plt.title('Network Visualization', fontsize=16)
plt.axis('off')
plt.tight_layout()
plt.savefig('network.png', dpi=300, bbox_inches='tight')
plt.savefig('network.pdf', bbox_inches='tight')  # Vector format

参考:请参阅 references/visualization.md,了解可视化技术的详尽文档,包括布局算法、自定义选项、使用 Plotly 和 PyVis 创建交互式可视化图、3D 网络,以及制作出版级质量的图表。

使用 NetworkX

安装

确保已安装 NetworkX:

# Check if installed
import networkx as nx
print(nx.__version__)

# Install if needed (via bash)
# uv pip install networkx
# uv pip install networkx[default]  # With optional dependencies
常见工作流模式

大多数 NetworkX 任务都遵循以下模式:

  1. 创建或加载图:

    # From scratch
    G = nx.Graph()
    G.add_edges_from([(1, 2), (2, 3), (3, 4)])
    
    # Or load from file/data
    G = nx.read_edgelist('data.txt')
    
  2. 检查结构:

    print(f"Nodes: {G.number_of_nodes()}")
    print(f"Edges: {G.number_of_edges()}")
    print(f"Density: {nx.density(G)}")
    print(f"Connected: {nx.is_connected(G)}")
    
  3. 分析:

    # Compute metrics
    degree_cent = nx.degree_centrality(G)
    avg_clustering = nx.average_clustering(G)
    
    # Find paths
    path = nx.shortest_path(G, source=1, target=4)
    
    # Detect communities
    communities = community.greedy_modularity_communities(G)
    
  4. 可视化:

    pos = nx.spring_layout(G, seed=42)
    nx.draw(G, pos=pos, with_labels=True)
    plt.show()
    
  5. 导出结果:

    # Save graph
    nx.write_graphml(G, 'analyzed_network.graphml')
    
    # Save metrics
    df = pd.DataFrame({
        'node': list(degree_cent.keys()),
        'centrality': list(degree_cent.values())
    })
    df.to_csv('centrality_results.csv', index=False)
    
重要注意事项

浮点精度:当图中包含浮点数时,由于精度限制,所有结果本质上都是近似值。这可能会影响算法结果,尤其是在计算最小值或最大值时。

内存与性能:每次运行脚本时,都必须将图数据加载到内存中。对于大型网络:

  • 使用合适的数据结构(大型稀疏图可使用稀疏矩阵)
  • 考虑仅加载必要的子图
  • 使用高效的文件格式(Python 对象可使用 pickle,或使用压缩格式)
  • 对于超大型网络,采用近似算法(例如,在中心性计算中使用 k 参数)
  • 对于繁重的工作负载,NetworkX 3.x 支持通过 backend= 关键字或 nx.config.backend_priority 使用可直接替换的加速后端,例如 nx-cugraph(GPU)、nx-parallel(多核)和 graphblas-algorithms(稀疏线性代数)。安装后端包,并在支持的函数中传入 backend="cugraph"(或类似值);无需更改算法代码。

节点与边的类型:

  • 节点可以是任何可哈希的 Python 对象(数字、字符串、元组、自定义对象)
  • 使用有意义的标识符,以便于理解
  • 移除节点时,其所有关联边都会自动移除

随机种子:为确保随机图生成和力导向布局的结果可复现,请始终设置随机种子:

G = nx.erdos_renyi_graph(n=100, p=0.1, seed=42)
pos = nx.spring_layout(G, seed=42)

快速参考

基本操作
# Create
G = nx.Graph()
G.add_edge(1, 2)

# Query
G.number_of_nodes()
G.number_of_edges()
G.degree(1)
list(G.neighbors(1))

# Check
G.has_node(1)
G.has_edge(1, 2)
nx.is_connected(G)

# Modify
G.remove_node(1)
G.remove_edge(1, 2)
G.clear()
核心算法
# Paths
nx.shortest_path(G, source, target)
nx.all_pairs_shortest_path(G)

# Centrality
nx.degree_centrality(G)
nx.betweenness_centrality(G)
nx.closeness_centrality(G)
nx.pagerank(G)

# Clustering
nx.clustering(G)
nx.average_clustering(G)

# Components
nx.connected_components(G)
nx.strongly_connected_components(G)  # Directed

# Community
community.greedy_modularity_communities(G)
文件 I/O 快速参考
# Read
nx.read_edgelist('file.txt')
nx.read_graphml('file.graphml')
nx.read_gml('file.gml')

# Write
nx.write_edgelist(G, 'file.txt')
nx.write_graphml(G, 'file.graphml')
nx.write_gml(G, 'file.gml')

# Pandas
nx.from_pandas_edgelist(df, 'source', 'target')
nx.to_pandas_edgelist(G)

资源

此技能包含全面的参考文档:

references/graph-basics.md

图类型、创建和修改图、添加节点和边、管理属性、检查结构以及使用子图的详细指南。

references/algorithms.md

全面介绍 NetworkX 算法,包括最短路径、中心性度量、连通性、聚类、社区检测、流算法、树算法、匹配、着色、同构和图遍历。

references/generators.md

全面介绍图生成器,包括经典图、随机模型(Erdős-Rényi、Barabási-Albert、Watts-Strogatz)、格、树、社交网络模型和专用生成器。

references/io.md

以各种格式读取和写入图的完整指南:边列表、邻接列表、GraphML、GML、JSON、CSV、Pandas DataFrame、NumPy 数组、SciPy 稀疏矩阵、数据库集成和格式选择指南。

references/visualization.md

可视化技术的详尽文档,包括布局算法、自定义节点和边的外观、标签、使用 Plotly 和 PyVis 创建交互式可视化、3D 网络、二部图布局以及制作适用于出版的图表。

其他资源

Agent 操作流程

  1. 检查环境。 确认 Python 环境和库版本(python -c "import pkg; print(pkg.__version__)"),并检查数据的形状、类型和缺失值。
  2. 明确输入。 根据数据或用户确认格式、标识符和参数。任何会影响结果的值都应询问,不要猜测。
  3. 先运行小规模版本。 先在样本或单个折上运行,并检查运行时间和内存。
  4. 按照上述说明和参考资料执行完整任务。
  5. 验证结果。 使用留出数据、固定随机种子和适当的指标;检查是否存在数据泄漏;报告不确定性(置信区间、不同随机种子下的标准差)。
  6. 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
如果发生这种情况请这样做
内存不足或执行非常缓慢进行子采样,使用分块或惰性计算,或缩小模型规模,并告知用户所做的更改。
这些说明中的函数、标志或端点在已安装的版本中不存在查阅已安装版本自己的文档(help()、--help、官方文档),进行适配,并告知用户。切勿编造 API。
必需的输入、标识符或参数不明确询问用户,或在运行前明确说明假设。

诚信规则

  • 切勿捏造结果、参数、标识符、引用或统计数据。如果无法运行或验证某项内容,请如实说明。
  • 切勿报告本次会话中未计算的指标;应展示生成每个数值的代码路径。
  • 将此处与特定版本相关的细节视为可能已过时:请根据已安装版本的官方文档确认。
  • 对于需要付费、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,执行前必须征得同意。

相关技能

  • torch-geometric:用于图神经网络的 PyTorch Geometric(PyG)——节点/链接/图分类、消息传递(GCN、GAT、GraphSAGE、GIN)、异构图……
  • research-knowledge-graph:将书目或文献语料转化为包含论文、作者、出版物、主题和引用链接的知识图谱,然后进行分析(引文……)

评论

支持 Markdown