有向图——自环有向图

概述

class DiGraph(incoming_graph_data=None, **attr)[源代码]

有向图的基类。

有向图存储具有可选数据或属性的节点和边。

有向图保留有向边。允许自循环,但不允许多个(平行)边。

节点可以是具有可选键/值属性的任意(哈希)python对象。按照惯例 None 不用作节点。

边缘表示为具有可选键/值属性的节点之间的链接。

参数:
  • incoming_graph_data输入图(可选,默认:无) )--要初始化图形的数据。如果没有(默认值),则创建一个空图形。数据可以是to-networkx-graph()函数支持的任何格式,当前包括边缘列表、dict-of-dict、dict-of-list、networkx-graph、numpy-matrix或2d-ndarray、scipy-sparse-matrix或pygraphviz-graph。
  • attrkeyword arguments, optional (default= no attributes) )--作为键=值对添加到图中的属性。

实际案例

创建一个没有节点和边的空图形结构(“空图形”)。

>>> G = nx.DiGraph()

G可以通过几种方式生长。

节点:

一次添加一个节点:

>>> G.add_node(1)

添加任何容器中的节点(列表、dict、set,甚至是文件中的行或另一个图中的节点)。

>>> G.add_nodes_from([2, 3])
>>> G.add_nodes_from(range(100, 110))
>>> H = nx.path_graph(10)
>>> G.add_nodes_from(H)

除了字符串和整数之外,任何可哈希的python对象(无对象除外)都可以表示一个节点,例如自定义的节点对象,甚至是另一个图。

>>> G.add_node(H)

边缘:

G也可以通过添加边来增长。

添加一个边缘,

>>> G.add_edge(1, 2)

边缘列表,

>>> G.add_edges_from([(1, 2), (1, 3)])

或者一组边缘,

>>> G.add_edges_from(H.edges)

如果某些边连接的节点还未在图形中,则会自动添加节点。添加已经存在的节点或边时没有错误。

属性:

每个图、节点和边都可以在关联的属性字典中保存键/值属性对(键必须是可哈希的)。默认情况下,这些值为空,但可以使用添加边、添加节点或直接操作分别命名为graph、node和edge的属性字典来添加或更改。

>>> G = nx.DiGraph(day="Friday")
>>> G.graph
{'day': 'Friday'}

使用add_node()、add_nodes_from()或g.nodes添加节点属性。

>>> G.add_node(1, time='5pm')
>>> G.add_nodes_from([3], time='2pm')
>>> G.nodes[1]
{'time': '5pm'}
>>> G.nodes[1]['room'] = 714
>>> del G.nodes[1]['room'] # remove attribute
>>> list(G.nodes(data=True))
[(1, {'time': '5pm'}), (3, {'time': '2pm'})]

使用add_edge()、add_edges_from()、下标符号或g.edges添加边缘属性。

>>> G.add_edge(1, 2, weight=4.7 )
>>> G.add_edges_from([(3, 4), (4, 5)], color='red')
>>> G.add_edges_from([(1, 2, {'color':'blue'}), (2, 3, {'weight':8})])
>>> G[1][2]['weight'] = 4.7
>>> G.edges[1, 2]['weight'] = 4

警告:我们通过 G.edges[1, 2] 一种只读的类似dict的结构。但是,您可以在例如 G.edges[1, 2] . 因此,使用2组括号添加/更改数据属性: G.edges[1, 2]['weight'] = 4 (对于多图表: MG.edges[u, v, key][name] = value

捷径:

许多常见的图形功能允许Python语法加速报告。

>>> 1 in G     # check if node in graph
True
>>> [n for n in G if n < 3]  # iterate through nodes
[1, 2]
>>> len(G)  # number of nodes in graph
5

通常,遍历图的所有边的最佳方法是通过邻居。据报道,邻居们都是邻接听写的。 G.adjG.adjacency()

>>> for n, nbrsdict in G.adjacency():
...     for nbr, eattr in nbrsdict.items():
...        if 'weight' in eattr:
...            # Do something useful with the edges
...            pass

但是边缘报告对象通常更方便:

>>> for u, v, weight in G.edges(data='weight'):
...     if weight is not None:
...         # Do something useful with the edges
...         pass

报告:

使用对象属性和方法获得简单的图形信息。报告通常提供视图而不是容器以减少内存使用。视图会随着图形的更新而更新,类似于dict视图。对象 nodes, ` 边`和 `adj 通过查找提供对数据属性的访问(例如 nodes[n], ` 边缘 [u, v] ‘ `adj[u][v] )和迭代(例如 nodes.items()nodes.data('color')nodes.data('color', default='blue') 同样地 edges )视图存在于 nodesedgesneighbors() 'adj'和 degree .

有关这些方法和其他杂项方法的详细信息,请参见下文。

子类(高级):

graph类使用dict数据结构的dict of dict。外部dict(节点dict)保存由节点键控的相邻信息。下一个dict(adjlist-dict)表示相邻信息,并保存由neighbor键控的边缘数据。内部dict(边缘attr u dict)表示边缘数据,并保存由属性名称键控的边缘属性值。

这三个dict中的每一个都可以在子类中被用户定义的dict-like对象替换。一般来说,应该维护类似dict的功能,但是可以添加额外的功能。要替换其中一个dict,请通过更改类(!)创建一个新的graph类。变量为该dict-like结构保留工厂。变量名为node洹dict_factory、node洹attr_dict_factory、adjlist_inner洹dict_factory、adjlist_outer洹dict_factory、edge洹attr_dict_factory和graph洹attr_dict_factory。

node_dict_factory : function, (default: dict)
工厂函数,用于创建包含节点属性的dict,由节点ID键控。它不需要参数,并返回类似dict的对象
节点u attr_dict_factory:函数,(默认值:dict)
用于创建节点属性dict的factory函数,其中保存由属性名键入的属性值。它不需要参数,并返回类似dict的对象
adjlist_outer_dict_factory : function, (default: dict)
factory函数用于在数据结构中创建最外部的dict,其中保存由节点键控的相邻信息。它不需要参数,并返回类似dict的对象。
adjlist_inner_dict_factory : function, optional (default: dict)
factory函数用于创建邻接列表dict,其中保存由邻居键入的边缘数据。它不需要参数并返回类似dict的对象
edge_attr_dict_factory : function, optional (default: dict)
用于创建边缘属性dict的工厂函数,它保存由属性名键入的属性值。它不需要参数,并返回类似dict的对象。
graph_attr_dict_factory : function, (default: dict)
用于创建图形属性dict的factory函数,其中保存由属性名键入的属性值。它不需要参数,并返回类似dict的对象。

通常,如果扩展不影响数据结构,则所有方法都将继承而不会出现问题,除非: to_directed/to_undirected . 默认情况下,这些方法创建一个有向图/图形类,您可能希望它们创建一个有向图/图形的扩展。为了方便这一点,我们定义了两个类变量,您可以在子类中设置这些变量。

to_directed_class : callable, (default: DiGraph or MultiDiGraph)
类以在 to_directed 方法。如果 None ,使用networkx类(有向图或多图)。
to_undirected_class : callable, (default: Graph or MultiGraph)
类以在 to_undirected 方法。如果 None ,使用networkx类(图形或多图形)。

实际案例

创建一个内存不足的图形类,通过对所有边使用单个属性dict来有效地禁用边属性。这会减少使用的内存,但会丢失边缘属性。

>>> class ThinGraph(nx.Graph):
...     all_edge_dict = {'weight': 1}
...     def single_edge_dict(self):
...         return self.all_edge_dict
...     edge_attr_dict_factory = single_edge_dict
>>> G = ThinGraph()
>>> G.add_edge(2, 1)
>>> G[2][1]
{'weight': 1}
>>> G.add_edge(2, 2)
>>> G[2][1] is G[2][2]
True

请看 ordered 有关通过重写基类创建图子类的更多示例 dict 像字典一样的东西。

方法

添加和删除节点和边

DiGraph.__init__ \ [incoming_graph_data] ) 用边、名称或图形属性初始化图形。
DiGraph.add_node \(添加节点 *  * 阿特克) 添加单个节点 node_for_adding 更新节点属性。
DiGraph.add_nodes_from \(添加节点 *  * 阿特克) 添加多个节点。
DiGraph.remove_node (n) 删除节点N。
DiGraph.remove_nodes_from (节点) 删除多个节点。
DiGraph.add_edge \(边缘的u,边缘的v, *  * 阿特克) 在U和V之间添加边。
DiGraph.add_edges_from \(从“开始”到“添加”, *  * 阿特克) 将ebunch_中的所有边添加到_add。
DiGraph.add_weighted_edges_from \(从“开始”到“添加”) 在中添加加权边 ebunch_to_add 指定重量属性
DiGraph.remove_edge (u,v) 移除U和V之间的边缘。
DiGraph.remove_edges_from [电子束] 删除ebunch中指定的所有边缘。
DiGraph.update \ [edges, nodes] ) 使用节点/边/图形作为输入更新图形。
DiGraph.clear () 从图形中删除所有节点和边。

报告节点边缘和邻居

DiGraph.nodes  图形的节点视图,如g.nodes或g.nodes()。
DiGraph.__iter__ () 循环访问节点。
DiGraph.has_node (n) 如果图表包含节点n,则返回true。
DiGraph.__contains__ (n) 如果n是节点,则返回true,否则返回false。
DiGraph.edges  有向图的outedgeview,如g.edges或g.edges()。
DiGraph.out_edges  有向图的outedgeview,如g.edges或g.edges()。
DiGraph.in_edges  图的一个线性视图,如g.in_edges或g.in_edges()。
DiGraph.has_edge (u,v) 如果边(u,v)在图中,则返回true。
DiGraph.get_edge_data (u,v) [, default] ) 返回与边(u,v)关联的属性字典。
DiGraph.neighbors (n) 返回N的后续节点上的迭代器。
DiGraph.adj  图形邻接对象,包含每个节点的邻居。
DiGraph.__getitem__ (n) 返回节点n的邻居的dict。
DiGraph.successors (n) 返回N的后续节点上的迭代器。
DiGraph.succ  包含每个节点的后续节点的图邻接对象。
DiGraph.predecessors (n) 返回n的前置节点上的迭代器。
DiGraph.pred  图形邻接对象,包含每个节点的前置任务。
DiGraph.adjacency () 返回所有节点的(node,adjacency dict)元组的迭代器。
DiGraph.nbunch_iter \ [nbunch] ) 返回包含在nbunch中的节点上的迭代器,该节点也在图中。

计算节点边缘和邻居

DiGraph.order () 返回图表中的节点数。
DiGraph.number_of_nodes () 返回图表中的节点数。
DiGraph.__len__ () 返回节点数。
DiGraph.degree  图形的degreeview,如g.degree或g.degree()。
DiGraph.in_degree  对于(节点,以度表示)或对于单个节点,以度表示的不一致视图。
DiGraph.out_degree  (节点、出度)的Outdegreeview
DiGraph.size \ [weight] ) 返回边数或所有边权重的总数。
DiGraph.number_of_edges \ [u, v] ) 返回两个节点之间的边数。

制作副本和子图

DiGraph.copy \ [as_view] ) 返回图表的副本。
DiGraph.to_undirected \ [reciprocal, as_view] ) 返回有向图的无向表示。
DiGraph.to_directed \ [as_view] ) 返回图形的定向表示形式。
DiGraph.subgraph (节点) 返回在上引发的子图的子图视图 nodes .
DiGraph.edge_subgraph (边) 返回由指定边诱导的子图。
DiGraph.reverse \ [copy] ) 返回图形的相反方向。