dgl.add_edges
- dgl.add_edges(g, u, v, data=None, etype=None)[source]
向图中添加边并返回一个新图。
第 i 条新边将从
u[i]
到v[i]
。新边的 ID 将从g.num_edges(etype)
开始。- 参数:
u (int, Tensor or iterable[int]) – 源节点 ID,
u[i]
表示第 i 条新边的源节点。v (int, Tensor or iterable[int]) – 目标节点 ID,
v[i]
表示第 i 条新边的目标节点。data (dict[str, Tensor], optional) – 添加的边的特征数据。键是特征名称,值是特征数据。
etype (str or (str, str, str), optional) –
边的类型名称。允许的类型名称格式为
(str, str, str)
表示源节点类型、边类型和目标节点类型。如果名称可以在图中唯一标识一个三元组格式,则可以是单个
str
边类型名称。
如果图只有一种边类型,则可以省略。
- 返回值:
添加了新边的图。
- 返回类型:
注意事项
如果给定边的端点在
g
中不存在,则调用dgl.add_nodes()
来添加这些节点。新节点的节点特征将用零填充。对于
g
中存在但不在data
中的特征,DGL 会为新添加的节点分配零特征。对于在
data
中存在但不在g
中的特征,DGL 会为图中现有节点分配零特征。此函数会丢弃批处理信息。请在变换后的图上使用
dgl.DGLGraph.set_batch_num_nodes()
和dgl.DGLGraph.set_batch_num_edges()
来保留信息。
示例
以下示例使用 PyTorch 后端。
>>> import dgl >>> import torch
同构图
>>> g = dgl.graph((torch.tensor([0, 1]), torch.tensor([1, 2]))) >>> g.num_edges() 2 >>> g = dgl.add_edges(g, torch.tensor([1, 3]), torch.tensor([0, 1])) >>> g.num_edges() 4
由于
u
或v
包含不存在的节点 ID,这些节点会被隐式添加。>>> g.num_nodes() 4
如果图已经有一些边特征,并且添加的新边没有特征,则它们的特征将被填充为零。
>>> g.edata['h'] = torch.ones(4, 1) >>> g = dgl.add_edges(g, torch.tensor([1]), torch.tensor([1])) >>> g.edata['h'] tensor([[1.], [1.], [1.], [1.], [0.]])
在添加新边时,你也可以为新边分配特征。
>>> g = dgl.add_edges(g, torch.tensor([0, 0]), torch.tensor([2, 2]), ... {'h': torch.tensor([[1.], [2.]]), 'w': torch.ones(2, 1)}) >>> g.edata['h'] tensor([[1.], [1.], [1.], [1.], [0.], [1.], [2.]])
由于
data
包含新的特征字段,旧边的特征将被填充为零。>>> g.edata['w'] tensor([[0.], [0.], [0.], [0.], [0.], [1.], [1.]])
异构图
>>> g = dgl.heterograph({ ... ('user', 'plays', 'game'): (torch.tensor([0, 1, 1, 2]), ... torch.tensor([0, 0, 1, 1])), ... ('developer', 'develops', 'game'): (torch.tensor([0, 1]), ... torch.tensor([0, 1])) ... }) >>> g.num_edges('plays') 4 >>> g = dgl.add_edges(g, torch.tensor([3]), torch.tensor([3]), etype='plays') >>> g.num_edges('plays') 5
另请参阅