dgl.bipartite_from_networkx
- dgl.bipartite_from_networkx(nx_graph, utype, etype, vtype, u_attrs=None, e_attrs=None, v_attrs=None, edge_id_attr_name=None, idtype=None, device=None)[source]
从 NetworkX 图创建并返回一个单向二分图。
创建的图将包含两种节点类型
utype
和vtype
,以及一种边类型etype
,其边由utype
指向vtype
。注意
从 NetworkX 图创建 DGLGraph 的速度并不快,尤其对于大规模图。建议先将 NetworkX 图转换为节点 tensor 元组,然后使用
dgl.heterograph()
构建 DGLGraph。- 参数:
nx_graph (networkx.DiGraph) – 包含图结构和节点/边属性的 NetworkX 图。如果节点的标签不是从零开始的连续整数,DGL 将重新标记节点。图必须遵循 NetworkX 的二分图约定,此外,边必须从具有属性
bipartite=0
的节点指向具有属性bipartite=1
的节点。utype (str, 可选) – 源节点类型的名称。
etype (str, 可选) – 边类型的名称。
vtype (str, 可选) – 目标节点类型的名称。
u_attrs (list[str], 可选) – 从 NetworkX 图中检索节点类型
utype
的节点属性名称列表。如果给定,DGL 将检索到的节点属性存储在返回图的nodes[utype].data
中,使用其原始名称。属性数据必须可转换为 Tensor 类型(例如,标量、numpy.ndarray
、列表等)。e_attrs (list[str], 可选) – 从 NetworkX 图中检索的边属性名称列表。如果给定,DGL 将检索到的边属性存储在返回图的
edata
中,使用其原始名称。属性数据必须可转换为 Tensor 类型(例如,标量、numpy.ndarray、列表等)。v_attrs (list[str], 可选) – 从 NetworkX 图中检索节点类型
vtype
的节点属性名称列表。如果给定,DGL 将检索到的节点属性存储在返回图的nodes[vtype].data
中,使用其原始名称。属性数据必须可转换为 Tensor 类型(例如,标量、numpy.array、列表等)。edge_id_attr_name (str, 可选) – 存储边 ID 的边属性名称。如果给定,DGL 将在创建图时相应地分配边 ID,因此该属性必须是有效的 ID,即从零开始的连续整数。默认情况下,返回图的边 ID 可以是任意的。
idtype (int32 或 int64, 可选) – 用于存储结构相关图信息(例如节点和边 ID)的数据类型。它应该是特定框架的数据类型对象(例如,torch.int32)。默认情况下,DGL 使用 int64。
device (device context, 可选) – 结果图的设备。它应该是特定框架的设备对象(例如,torch.device)。默认情况下,DGL 将图存储在 CPU 上。
- 返回值:
创建的图。
- 返回类型:
示例
以下示例使用 PyTorch 后端。
>>> import dgl >>> import networkx as nx >>> import numpy as np >>> import torch
创建一个包含 2 条边的单向二分图。
>>> nx_g = nx.DiGraph() >>> # Add nodes for the source type >>> nx_g.add_nodes_from([1, 3], bipartite=0, feat1=np.zeros((2, 1)), feat2=np.ones((2, 1))) >>> # Add nodes for the destination type >>> nx_g.add_nodes_from([2, 4, 5], bipartite=1, feat3=np.zeros((3, 1))) >>> nx_g.add_edge(1, 4, weight=np.ones((1, 1)), eid=np.array([1])) >>> nx_g.add_edge(3, 5, weight=np.ones((1, 1)), eid=np.array([0]))
仅转换为包含结构的 DGLGraph。
>>> g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='_V')
检索图的节点/边特征。
>>> g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='_V', ... u_attrs=['feat1', 'feat2'], ... e_attrs=['weight'], ... v_attrs=['feat3'])
使用预先指定的边顺序。
>>> g.edges() (tensor([0, 1]), tensor([1, 2])) >>> g = dgl.bipartite_from_networkx(nx_g, ... utype='_U', etype='_E', vtype='_V', ... edge_id_attr_name='eid') (tensor([1, 0]), tensor([2, 1]))
在第一个 GPU 上创建一个数据类型为 int32 的图。
>>> g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='_V', ... idtype=torch.int32, device='cuda:0')