有自循环的无向图#
概述#
- class Graph(incoming_graph_data=None, **attr)[源代码]#
无向图的基类。
图形用可选数据或属性存储节点和边。
图有无向边。允许自循环,但不允许多个(平行)边。
节点可以是具有可选键/值属性的任意(可哈希)Python对象,但
None
不允许作为节点。边缘表示为具有可选键/值属性的节点之间的链接。
- 参数
- incoming_graph_data输入图形(可选,默认:无)
要初始化图形的数据。如果为None(默认),则创建一个空图。数据可以是to_networkx_graph()函数支持的任何格式,当前包括边列表、字典的字典、列表的字典、网络X图、2D NumPy数组、SciPy稀疏矩阵或PyGraphviz图。
- attr关键字参数,可选(默认值=无属性)
要以键=值对的形式添加到图表中的属性。
实例
创建一个没有节点和边的空图形结构(“空图形”)。
>>> G = nx.Graph()
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.Graph(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 # node must exist already to use G.nodes >>> 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
一种只读的类似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.adj
或G.adjacency()
>>> for n, nbrsdict in G.adjacency(): ... for nbr, eattr in nbrsdict.items(): ... if "weight" in eattr: ... # Do something useful with the edges ... pass
但是,edges()方法通常更方便:
>>> for u, v, weight in G.edges.data("weight"): ... if weight is not None: ... # Do something useful with the edges ... pass
报告:
使用对象属性和方法获得简单的图形信息。报告通常提供视图而不是容器,以减少内存使用。视图会随着图形的更新而更新,类似于dict视图。对象
nodes
,edges
和adj
通过查找提供对数据属性的访问(例如nodes[n]
,edges[u, v]
,adj[u][v]
)和迭代(例如nodes.items()
,nodes.data('color')
,nodes.data('color', default='blue')
同样地edges
)视图存在于nodes
,edges
,neighbors()
'adj'和degree
.有关这些方法和其他杂项方法的详细信息,请参见下文。
子类(高级):
graph类使用dict数据结构的dict of dict。外部dict(节点dict)保存由节点键控的相邻信息。下一个dict(adjlist-dict)表示相邻信息,并保存由neighbor键控的边缘数据。内部dict(边缘attr u dict)表示边缘数据,并保存由属性名称键控的边缘属性值。
这三个词典中的每一个都可以在子类中由用户定义的类似词典的对象替换。一般来说,应该保留类似词典的功能,但可以添加额外的功能。要替换其中一个字典,请通过更改类(!)来创建新的图形类变量控制着工厂的那个类似字典的结构。
- node_dict_factory函数(默认值:dict)
工厂函数,用于创建包含节点属性的dict,由节点ID键控。它不需要参数,并返回类似dict的对象
- 节点u attr_dict_factory:函数,(默认值:dict)
用于创建节点属性dict的factory函数,其中保存由属性名键入的属性值。它不需要参数,并返回类似dict的对象
- adjlist_outer_dict_factory函数(默认值:dict)
factory函数用于在数据结构中创建最外部的dict,其中保存由节点键控的相邻信息。它不需要参数,并返回类似dict的对象。
- adjlist_inner_dict_factory函数(默认值:dict)
factory函数用于创建邻接列表dict,其中保存由邻居键入的边缘数据。它不需要参数并返回类似dict的对象
- edge_attr_dict_factory函数(默认值:dict)
用于创建边缘属性dict的工厂函数,它保存由属性名键入的属性值。它不需要参数,并返回类似dict的对象。
- graph_attr_dict_factory函数(默认值:dict)
用于创建图形属性dict的factory函数,其中保存由属性名键入的属性值。它不需要参数,并返回类似dict的对象。
通常,如果扩展不影响数据结构,则所有方法都将继承而不会出现问题,除非:
to_directed/to_undirected
. 默认情况下,这些方法创建一个有向图/图形类,您可能希望它们创建一个有向图/图形的扩展。为了方便这一点,我们定义了两个类变量,您可以在子类中设置这些变量。- to_directed_class可调用(默认:有向图或多图)
类以在
to_directed
方法。如果None
,使用networkx类(有向图或多图)。- to_undirected_class可调用(默认:图形或多图形)
类以在
to_undirected
方法。如果None
,使用networkx类(图形或多图形)。
Subclassing Example
创建一个内存不足的图形类,通过对所有边使用单个属性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
方法#
添加和删除节点和边#
|
用边、名称或图形属性初始化图形。 |
|
添加单个节点 |
|
添加多个节点。 |
删除节点N。 |
|
|
删除多个节点。 |
|
在U和V之间添加边。 |
|
将ebunch_中的所有边添加到_add。 |
|
在中添加加权边 |
|
移除U和V之间的边缘。 |
|
删除ebunch中指定的所有边缘。 |
|
使用节点/边/图形作为输入更新图形。 |
从图形中删除所有节点和边。 |
|
从图形中移除所有边,而不改变节点。 |
报告节点边缘和邻居#
图形的节点视图,如g.nodes或g.nodes()。 |
|
循环访问节点。 |
|
如果图表包含节点n,则返回true。 |
|
如果n是节点,则返回true,否则返回false。 |
|
图形的边缘视图,如g.edges或g.edges()。 |
|
|
如果边(u,v)在图中,则返回true。 |
|
返回与边(u,v)关联的属性字典。 |
返回节点n的所有邻居的迭代器。 |
|
图形邻接对象,包含每个节点的邻居。 |
|
返回节点n的邻居的dict。 |
|
返回所有节点的(node,adjacency dict)元组的迭代器。 |
|
|
返回包含在nbunch中的节点上的迭代器,该节点也在图中。 |
计算节点边缘和邻居#
返回图表中的节点数。 |
|
返回图表中的节点数。 |
|
返回图表中的节点数。 |
|
图形的degreeview,如g.degree或g.degree()。 |
|
|
返回边数或所有边权重的总数。 |
|
返回两个节点之间的边数。 |
制作副本和子图#
|
返回图表的副本。 |
|
返回图表的无向副本。 |
|
返回图形的定向表示形式。 |
|
返回在上引发的子图的子图视图 |
|
返回由指定边诱导的子图。 |