多重图---有自循环和平行边的无向图

概述

class MultiGraph(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.MultiGraph()

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也可以通过添加边来增长。

添加一个边缘,

>>> key = G.add_edge(1, 2)

边缘列表,

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

或者一组边缘,

>>> keys = G.add_edges_from(H.edges)

如果某些边连接的节点还未在图形中,则会自动添加节点。如果边已经存在,则使用键创建和存储一个附加边以标识该边。默认情况下,键是最低的未使用整数。

>>> keys = G.add_edges_from([(4,5,{'route':28}), (4,5,{'route':37})])
>>> G[4]
AdjacencyView({3: {0: {}}, 5: {0: {}, 1: {'route': 28}, 2: {'route': 37}}})

属性:

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

>>> G = nx.MultiGraph(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添加边缘属性。

>>> key = G.add_edge(1, 2, weight=4.7 )
>>> keys = G.add_edges_from([(3, 4), (4, 5)], color='red')
>>> keys = G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
>>> G[1][2][0]['weight'] = 4.7
>>> G.edges[1, 2, 0]['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[1] # adjacency dict-like view keyed by neighbor to edge attributes
AdjacencyView({2: {0: {'weight': 4}, 1: {'color': 'blue'}}})

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

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

但是,edges()方法通常更方便:

>>> for u, v, keys, weight in G.edges(data='weight', keys=True):
...     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 .

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

子类(高级):

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

在dict结构的dict的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洹key_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, (default: dict)
factory函数用于创建邻接列表dict,其中保存邻居键控的多边缘密钥dict。它不需要参数,并返回类似dict的对象。
edge_key_dict_factory : function, (default: dict)
用于创建边键dict的工厂函数,它保存由边键键入的边数据。它不需要参数,并返回类似dict的对象。
edge_attr_dict_factory : function, (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类(图形或多图形)。

实际案例

请看 ordered 例如,通过重写基类来创建图子类 dict 像字典一样的东西。

方法

添加和删除节点和边

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

报告节点边缘和邻居

MultiGraph.nodes  图形的节点视图,如g.nodes或g.nodes()。
MultiGraph.__iter__ () 循环访问节点。
MultiGraph.has_node (n) 如果图表包含节点n,则返回true。
MultiGraph.__contains__ (n) 如果n是节点,则返回true,否则返回false。
MultiGraph.edges  返回边缘上的迭代器。
MultiGraph.has_edge (u,v) [, key] ) 如果图在节点u和v之间有边,则返回true。
MultiGraph.get_edge_data (u,v) [, key, default] ) 返回与边(u,v)关联的属性字典。
MultiGraph.neighbors (n) 返回节点n的所有邻居的迭代器。
MultiGraph.adj  图形邻接对象,包含每个节点的邻居。
MultiGraph.__getitem__ (n) 返回节点n的邻居的dict。
MultiGraph.adjacency () 返回所有节点的(node,adjacency dict)元组的迭代器。
MultiGraph.nbunch_iter \ [nbunch] ) 返回包含在nbunch中的节点上的迭代器,该节点也在图中。

计算节点边缘和邻居

MultiGraph.order () 返回图表中的节点数。
MultiGraph.number_of_nodes () 返回图表中的节点数。
MultiGraph.__len__ () 返回节点数。
MultiGraph.degree  图形的degreeview,如g.degree或g.degree()。
MultiGraph.size \ [weight] ) 返回边数或所有边权重的总数。
MultiGraph.number_of_edges \ [u, v] ) 返回两个节点之间的边数。

制作副本和子图

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