Pytorch神经网络实战学习笔记_44 DGLGraph图的基本操作(缺一部分 明天补)

1 DGLGraph图的创建与维护

1.1 生成DGLGraph图并且增加顶点与边

import dgl
import torch as th

# 边 0->1, 0->2, 0->3, 1->3
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))

print(g) # 图中节点的数量是DGL通过给定的图的边列表中最大的点ID推断所得出的
# 获取节点的ID
print(g.nodes())
# 获取边的对应端点
print(g.edges())
# 获取边的对应端点和边ID
print(g.edges(form='all'))
# 如果具有最大ID的节点没有边,在创建图的时候,用户需要明确地指明节点的数量。
g = dgl.graph((u, v), num_nodes=8)

1.2 获得DGLGraph图的顶点与边

import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
g_dgl = dgl.DGLGraph() # 生成一个空图
g_dgl.add_nodes(4) # 增加四个顶点
g_dgl.add_edges(list(range(4)),[0]*4) # 增加四条边
print("顶点",g_dgl.nodes()) # 输出顶点列表
print("边:",g_dgl.edges()) # 输出边
print("边索引",g_dgl.edge_id(1,0)) # 输出边索引
print("边属性",g_dgl.edges[g_dgl.edge_id(1,0)]) # 输出边属性

顶点 tensor([0, 1, 2, 3])
边: (tensor([0, 1, 2, 3]), tensor([0, 0, 0, 0]))
边索引 1
边属性 EdgeSpace(data={})

1.3 删除DGLGraph图的顶点与边

g_dgl.remove_edges(i) # 删除索引值为i的边
print(g_dgl.number_of_edges()) # 输出图的边数

1.4 清空DGLGraph图

g_dgl.clear() # 清空图内容

2 查看DGLGraph图中的度

DGLGraph图按照边的方向将度分为两种:连接其他顶点的度(out)和被其他顶点连接的度。

  • in_degree:查询指定顶点被连接的边数。
  • in_degrees:查询多个顶点被连接的边数,默认查询图中的全部顶点。
  • out_degree:查询指定顶点连接其他顶点的边数。
  • out_degrees:查询多个顶点连接其他顶点的边数,默认查询图中的全部顶点。

2.1 代码实战:查看DGLGraph图中的度

import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
g_dgl = dgl.DGLGraph() # 生成一个空图
g_dgl.add_nodes(4) # 增加四个顶点
g_dgl.add_edges(list(range(4)),[0]*4) # 增加四条边
print(g_dgl.in_degree(0)) # 查询连接0顶点的度,输出:4
print(g_dgl.in_degrees([0,1])) # 查询连接0,1顶点的度,输出:tensor([4, 0])
print(g_dgl.in_degrees()) # 查询全部顶点被连接的度,输出:tensor([4, 0, 0, 0])
print(g_dgl.out_degrees()) # 查询全部顶点向外连接的度,输出:tensor([1, 1, 1, 1])

3 DGLGraph图与NetWorkx图的相互转化

DGLGraph类在NetWorkx模块之上进行扩展

3.1 将DGLGraph图转成NetWorkx图并显示

将DGLGraph图转成NetWorkx图后便可以借助NetWorkx图的显示功能来可视化其内部结构。

import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

g_dgl = dgl.DGLGraph() # 生成一个空图
g_dgl.add_nodes(4) # 增加四个顶点
g_dgl.add_edges(list(range(4)),[0]*4) # 增加四条边

nx.draw(g_dgl.to_networkx(),with_labels=True) # 先调用to_networkx()方法,将DGLGraph图转成NetWorkx图,再调用NeWorkx的draw()方法进行显示。

#### Networkx库中对图的可视化没有自环图的功能

3.2 利用NetWorkx图创建DGLGraph图

DGLGraph图可以从NetWorkx图中转化而来。

3.2.1 代码实战:利用NetWorkx图创建DGLGraph图

先调用dgl.DGLGraph()将NetWorkx图转化为DGLGraph图,再调用了DGLGraph图对象的to_networkx()方法,将DGLGraph图转换为NetWorkx图显示。

import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

g_nx = nx.petersen_graph() # 创建一个Networkx类型的无向图petersen
g_dgl = dgl.DGLGraph(g_nx) # 将Networkx类型转化为DGLGraph
plt.figure(figsize=(20,6))
plt.title("Networkx无向图",fontsize=20)
nx.draw(g_nx,with_labels=True)
plt.subplots(122)
plt.title("DGL有向图",fontsize=20)
nx.draw(g_dgl.to_networkx(),with_labels=True) # 将DGLGraph转化为Networkx类型的图

4 DGLGraph图中顶点属性的操作

4.1 为图添加节点特征和边特征

许多图数据包含节点和边上的属性,即节点特征和边特征。虽然节点特征和边特征的类型在现实世界中可以是任意的,但是DGLGraph只接受存储在张量(Tensor)中的属性,且该属性必须为数值类型。

4.2 修改顶点属性

4.3 删除顶点属性

DGL库官方操作指南https://docs.dgl.ai/

猜你喜欢

转载自blog.csdn.net/qq_39237205/article/details/123877561