NetworkX 1.0#

发布日期:2010年1月8日

版本 1.0 需要 Python 2.4 或更高版本。

新特性#

此版本对图 API 的部分内容进行了重大修改,以支持图、节点和边的属性。请参见 http://networkx.lanl.gov/reference/api_changes.html

  • 更新了 Graph、DiGraph 和 MultiGraph 类以支持属性。

  • 默认边数据现在为空字典(之前为整数 1)

  • 差集和交集运算符

  • 平均最短路径

  • A*(A-Star)算法

  • PageRank、HITS 和特征向量中心性

  • 读取 Pajek 文件

  • 线图

  • 最小生成树(Kruskal 算法)

  • 密集和稀疏的 Fruchterman-Reingold 布局

  • 随机簇状图生成器

  • 有向无标度图生成器

  • 更快的随机正则图生成器

  • 使用 Matplotlib 改进了边的颜色和标签绘制

  • 还有更多内容,请参见 https://networkx.lanl.gov/trac/query?status=closed&group=milestone&milestone=networkx-1.0

示例#

  • 更新以使用 networkx-1.0 API

  • 图子类示例

版本编号#

未来我们将采用更标准的版本发布编号系统,使用 major.minor[build] 标签,其中 major 和 minor 是数字,[build] 是一个标签,例如“dev1379”表示开发版本,或“rc1”表示发布候选版本。

我们计划更紧密地遵循基于时间的发布计划,大约每季度发布一次较小的增量更改。图类 API 将保持固定,除非我们确定现有类中存在严重错误或其他缺陷,直到将来某个时候发布 networkx-2.0。

基类的更改#

最重要的更改在于图类。现在所有的图类都允许可选的图、节点和边属性。这些属性在图类内部以字典的形式存储,并且在大多数情况下可以像 Python 字典一样简单地访问。

图属性#

每个图都在成员 G.graph 中保留一个 key=value 属性字典。可以直接使用 G.graph 访问这些属性,或者在实例化时使用关键字参数添加。

>>> G=nx.Graph(region='Africa')
>>> G.graph['color']='green'
>>> G.graph
{'region': 'Africa', 'color': 'green'}

节点属性#

每个节点都有一个相应的属性字典。向节点添加属性是可选的。

使用 add_node()、add_nodes_from() 或 G.node 添加节点属性

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

边属性#

每条边都有一个相应的属性字典。默认边数据现在是一个空的属性字典,并且向边添加属性是可选的。

一个常见的用例是向边添加一个权重属性

>>> G.add_edge(1,2,weight=3.14159)

使用 add_edge()、add_edges_from()、下标表示法或 G.edge 添加边属性。

>>> 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.edge[1][2]['weight'] = 4  

更改的方法#

Graph()、DiGraph()、MultiGraph()、MultiDiGraph()#

现在在初始化时可以接受可选的 keyword=value 属性。

>>> G=nx.Graph(year='2009',city='New York')

add_node()#

现在可以接受可选的 keyword=value 属性或一个属性字典。

>>> G.add_node(1,room=714)

add_nodes_from()#

现在可以接受可选的 keyword=value 属性或一个应用于所有受影响节点的属性字典。

>>> G.add_nodes_from([1,2],time='2pm')  # all nodes have same attribute

add_edge()#

现在可以接受可选的 keyword=value 属性或一个属性字典。

>>> G.add_edge(1, 2, weight=4.7 )

add_edges_from()#

现在可以接受可选的 keyword=value 属性或一个应用于所有受影响边的属性字典。

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

nodes() 和 nodes_iter()#

新的 data=True|False 关键字参数决定是否返回带有节点属性字典的二元组 (n,dict) (True)

>>> G=nx.Graph([(1,2),(3,4)])
>>> G.nodes(data=True)  
[(1, {}), (2, {}), (3, {}), (4, {})]

copy()#

现在返回图的深拷贝(复制节点和边的所有底层数据和属性)。使用类初始化器进行浅拷贝

>>> G=nx.Graph()
>>> G_shallow=nx.Graph(G) # shallow copy
>>> G_deep=G.copy() # deep copy

to_directed()、to_undirected()#

现在返回图的深拷贝(复制节点和边的所有底层数据和属性)。使用类初始化器进行浅拷贝

>>> G = nx.Graph()
>>> D_shallow = nx.DiGraph(G) # shallow copy
>>> D_deep = G.to_directed() # deep copy

subgraph()#

当 copy=True 时,现在返回图的深拷贝(复制节点和边的所有底层数据和属性)。

>>> G = nx.Graph()
>>> # note: copy keyword deprecated in networkx>1.0
>>> # H = G.subgraph([],copy=True)  # deep copy of all data

add_cycle()、add_path()、add_star()#

现在可以接受可选的 keyword=value 属性或一个属性字典,这些属性应用于受方法影响的所有边。

>>> G = nx.Graph()
>>> G.add_path([0, 1, 2, 3], width=3.2)  

移除的方法#

delete_node()#

推荐的名称现在是 remove_node()。

delete_nodes_from()#

尝试删除图中不存在的节点时不再引发异常。推荐的名称现在是 remove_nodes_from()。

delete_edge()#

尝试删除图中不存在的边时现在会引发异常。推荐的名称现在是 remove_edge()。

delete_edges_from()#

推荐的名称现在是 remove_edges_from()。

has_neighbor()

使用 has_edge()

get_edge()#

已重命名为 get_edge_data()。返回边属性字典。

获取边 (u,v) 数据最快的方法是使用 G[u][v] 而不是 G.get_edge_data(u,v)

移除的成员#

directed, multigraph, weighted#

使用方法 G.is_directed() 和 G.is_multigraph()。如果图中在“weight”边属性中有数值,则现在所有图都是加权图。

添加的方法#

add_weighted edges_from()#

使用由 3 元组 (u,v,weight) 组成的列表向图中添加加权边的便捷方法。

get_edge_data()#

从 get_edge() 重命名而来。

获取边 (u,v) 数据最快的方法是使用 G[u][v] 而不是 G.get_edge_data(u,v)

is_directed()#

替换了成员 G.directed

is_multigraph()#

替换了成员 G.multigraph

移除的类#

LabeledGraph, LabeledDiGraph#

这些类已被合并到常规类中。

UbiGraph#

已移除,因为不再支持 ubigraph 平台。

附加函数/生成器#

ego_graph, stochastic_graph, PageRank 算法, HITS 算法, GraphML 写入器, freeze, is_frozen, A* 算法, 有向无标度生成器, 随机簇状图。

将现有代码转换为 networkx-1.0#

加权边#

边信息现在存储在属性字典中,因此所有边数据都必须指定一个键来标识它。

目前只有一个标准/保留键“weight”,加权边算法和函数使用它。关联的值应为数值。所有其他键可供用户根据需要指定。

>>> G=nx.Graph()
>>> G.add_edge(1,2,weight=3.1415) # add the edge 1-2 with a weight
>>> G[1][2]['weight']=2.3 # set the weight to 2.3

类似地,对于直接访问边数据,使用边数据的键来检索它。

>>> w = G[1][2]['weight']

所有需要/使用加权边的 NetworkX 算法现在都使用“weight”边属性。如果您现有的算法假定边数据是数值,则应将 G[u][v] 和 G.get_edge(u,v) 替换为 G[u][v][‘weight’]。

获取分配或未分配权重键的图的权重的一种常用写法是

>>> w= G[1][2].get('weight',1)  # set w to 1 if there is no 'weight' key