【python】networkx包对图相关操作

NetworkX 是一个用于创建、操作和研究复杂网络的结构、动态和功能的 Python 包。它提供了丰富的数据结构和函数,便于处理图和网络。下面是 NetworkX 包的一些主要功能:

  1. 图的创建与操作

    • 支持多种类型的图(无向图、有向图、多重图、加权图等)。
    • 可以方便地添加、删除节点和边。
    • 支持许多图论算法,如最短路径、网络流、圈检测等。
  2. 图的测量与分析

    • 提供多种图的中心性测量方法,如度中心性、接近中心性、介数中心性等。
    • 支持社区检测、小世界网络检测等高级网络分析功能。
    • 能够计算图的直径、密度、连通性等属性。
  3. 图的可视化

    • 虽然 NetworkX 本身的可视化功能有限,它可以与其他库(如 Matplotlib)配合,来创建图形的视觉表示。
    • 支持定制节点和边的样式、布局等。
  4. 图与数据结构的兼容性

    • 可以从多种数据格式导入和导出图,如边列表、邻接矩阵、GEXF、GraphML、Pickle等。
    • 方便与 Pandas 和 NumPy 等数据处理库配合使用,进行数据分析和处理。
  5. 算法支持

    • 包括经典的图论算法,例如 Dijkstra、Floyd-Warshall、Prim、Kruskal 等。
    • 支持更复杂的结构如生成树、网络流、路径算法等。

这些功能使得 NetworkX 成为在学术研究和实际应用中分析和可视化网络数据的有力工具。

目录

一、networkx模块安装和调用

二、使用

生成图

读取图

获取图的点与边

获取点的邻居与权重

 判断是否存在节点/边

修改图

添加/删除节点

添加/删除边

为边添加权重

对graph的node节点重新编号


一、networkx模块安装和调用

pip install networkx  
import networkx as nx

二、使用

生成图

生成图主要有 nx.DiGraph 有向图和 nx.Graph 无向图两种,除了图的不同外,边可以区分为有权重和无权重,下面介绍生成带权重有向图的方法,无向图和无权重可以参考类似生成方法。

import networkx as nx
import random

def createGraph():
    f = open(edge_file, "w")
    for i in range(node_num):
        node_from = random.randint(0, 1000)
        node_to = random.randint(0, 1000)
        weight = random.random()
        if node_from != node_to:
            f.write("%s %s %s\n" % (node_from, node_to, weight))
    f.close()

# 1.构造图
edge_file = "graph_edge.txt"
node_num = 1000
createGraph()

这里随机生成一些测试数据,node_from 和 node_to 分别代表起始点,createGraph 方法会生成约 node_num 条带权重边,示例如下,起始点已经通过数字标识,权重通过 float 的形式给出: 

读取图

上述方法生成了图的模拟节点,下面通过 nx.read_edgelist 方法读取图的边与权重,node_from 和 node_to 为节点,create_using 选择 nx.DiGraph 则为有向图,选择 nx.Graph 则为无向图,nodetype 可以选择None,也可以选择对应类型,例如 int 等等,data 为我们对边的附属描述,这里第三列我们规定其为 float 类型的 weight。

def loadGraph(fileName):
    G = nx.read_edgelist(fileName, create_using=nx.DiGraph(), nodetype=None, data=[('weight', float)])
    return G

G = loadGraph(edge_file)

获取图的点与边

G.nodes() 获取图中全部点,number_of_nodes() 获取图中顶点的数量,可以通过 for 循环遍历 nodes,也可以通过 list(G.nodes()) 包装执行其他的迭代操作。

G.edges() 获取图中全部边,如果需要显示边的附加信息,例如上例中我们添加了 weight 选项,data=Teue 则可以保证信息全部打印,G.number_of_edges() 获取全部边的数量。

print("节点和边的个数:", G.number_of_nodes(), G.number_of_edges())
# # 获取路网的每条节点/边属性信息
print("节点和边:", list(G.nodes(data=True))[0], list(G.edges(data=True))[0])

获取点的邻居与权重

获取相关顶点的邻居,可以通过 nx 的 neighbors 方法获取对应顶点的邻居以及与对应邻居的权重(如果有)。

# 4.获取节点邻居
for node in G.nodes:
    nbrs = list(G.neighbors(node))
    weights = []
    for nbr in nbrs:
        weights.append(G[node][nbr]["weight"])
    print("节点", node, "的邻居:", nbrs, "对应权重", weights)
    break

 判断是否存在节点/边

Graph.has_edge(uv),其中参数: u, v (节点) ,返回值:如果有边则返回True,否则返回False。

# 判断是否存在
print(G.has_node('221'))
print(G.has_edge('221', '5221'))

 

修改图

通过上面的操作,已经可以从基础的数据中生成图并获取图的顶点与边,接下来需要对图进行微调,则需要增删改查的方法,下面介绍常用的方法:

添加/删除节点

可以一次添加一个节点,或从任何 iterable 容器,如列表

# 添加/删除 节点
G.add_node('10')
G.add_nodes_from(['1', '2', '3'])  # 批量添加
G.remove_node('10')
G.remove_nodes_from(['1', '2', '3'])  # 批量删除

添加/删除边

G 也可以通过一次添加一个边来生长,或者通过添加边列表,

# 添加/删除 边
G.add_edge('1', '2')
G.add_edges_from([('1', '2'), ('3', '4')])  # 批量添加
G.remove_edge('1', '2')
G.remove_edges_from([('1', '2'), ('3', '4')])  # 批量删除

为边添加权重

# 为边添加权重
G.add_edge('1', '2')
G.edges['1', '2']['weight'] = 0.33

对graph的node节点重新编号

import networkx as nx

# 创建一个示例图
G = nx.DiGraph()
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5)])

# 创建一个新的节点编号映射字典
new_node_labels = {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}

# 使用relabel_nodes重新编号节点
H = nx.relabel_nodes(G, new_node_labels)

# 输出重新编号后的图
print("Original Graph:")
print(G.nodes)
print(G.out_degree())
print("Graph after relabeling nodes:")
print(H.nodes)
print(H.out_degree())

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值