dgl.reverse
- dgl.reverse(g, copy_ndata=True, copy_edata=False, *, share_ndata=None, share_edata=None)[源码]
返回一个新图,其中每条边都是输入图中的反向边。
一个图的逆(也称为反向图、转置图)是指一个新图,其中类型为
(U, E, V)
的边 \((i_1, j_1), (i_2, j_2), \cdots\) 在新图中变为类型为(V, E, U)
的边 \((j_1, i_1), (j_2, i_2), \cdots\)。返回的图与原始图共享数据结构,即 dgl.reverse 不会为反向图创建额外的存储空间。
- 参数:
- 返回值:
反向图。
- 返回值类型:
注意事项
如果
copy_ndata
或copy_edata
为 True,结果图将与输入图共享节点或边特征张量。因此,用户应尽量避免会同时影响两个图的原地操作。此函数会丢弃批处理信息。请在转换后的图上使用
dgl.DGLGraph.set_batch_num_nodes()
和dgl.DGLGraph.set_batch_num_edges()
来保留信息。示例
同构图
创建一个要反向的图。
>>> import dgl >>> import torch as th >>> g = dgl.graph((th.tensor([0, 1, 2]), th.tensor([1, 2, 0]))) >>> g.ndata['h'] = th.tensor([[0.], [1.], [2.]]) >>> g.edata['h'] = th.tensor([[3.], [4.], [5.]])
反向图。
>>> rg = dgl.reverse(g, copy_edata=True) >>> rg.ndata['h'] tensor([[0.], [1.], [2.]])
反向图中的第 i 条边对应于原始图中的第 i 条边。当
copy_edata
为 True 时,它们具有相同的特征。>>> rg.edges() (tensor([1, 2, 0]), tensor([0, 1, 2])) >>> rg.edata['h'] tensor([[3.], [4.], [5.]])
异构图
>>> g = dgl.heterograph({ ... ('user', 'follows', 'user'): (th.tensor([0, 2]), th.tensor([1, 2])), ... ('user', 'plays', 'game'): (th.tensor([1, 2, 1]), th.tensor([2, 1, 1])) ... }) >>> g.nodes['game'].data['hv'] = th.ones(3, 1) >>> g.edges['plays'].data['he'] = th.zeros(3, 1)
结果图将包含边类型
('user', 'follows', 'user)
和('game', 'plays', 'user')
。>>> rg = dgl.reverse(g, copy_ndata=True) >>> rg Graph(num_nodes={'game': 3, 'user': 3}, num_edges={('user', 'follows', 'user'): 2, ('game', 'plays', 'user'): 3}, metagraph=[('user', 'user'), ('game', 'user')]) >>> rg.edges(etype='follows') (tensor([1, 2]), tensor([0, 2])) >>> rg.edges(etype='plays') (tensor([2, 1, 1]), tensor([1, 2, 1])) >>> rg.nodes['game'].data['hv'] tensor([[1.], [1.], [1.]]) >>> rg.edges['plays'].data {}