NetworkX 0.99#

发布日期:2008年11月18日

参见:https://networkx.lanl.gov/trac/timeline

新特性#

此版本对图 API 的部分内容进行了重大更改。参见 http://networkx.lanl.gov/reference/api_changes.html

  • 更新 Graph 和 DiGraph 类以默认使用加权图。API 变更旨在提高性能和简化代码。

  • 新的 MultiGraph 和 MultiDiGraph 类(取代 XGraph 和 XDiGraph)

  • 更新以使用 Sphinx 文档系统 http://networkx.lanl.gov/

  • 开发者网站:https://networkx.lanl.gov/trac/

  • 实验性的 LabeledGraph 和 LabeledDiGraph

  • 将包和文件布局移动到子目录中。

错误修复#

  • 正确处理 draw_graphviz 的 root= 选项

示例#

  • 更新以兼容 networkx-0.99 API

  • 绘图示例现在使用 matplotlib.pyplot 接口

  • 许多示例中的绘图得到改进

  • 新示例 - 参见 http://networkx.lanl.gov/examples/

networkx-0.99 版本是 networkx-1.0 之前的倒数第二个版本。我们将版本号从 0.37 提升到 0.99,以表明(在我们不同寻常的版本号方案中)这是 NetworkX 的一个重大变更。

我们对 NetworkX 进行了一些重大更改(详情如下),以提高性能、功能和清晰度。

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

请将评论和问题发送到 networkx-discuss 邮件列表。http://groups.google.com/group/networkx-discuss

基础类的变更#

最重大的变更在于图类。我们重新设计了 Graph() 和 DiGraph() 类,以可选地允许边数据。此变更使 Graph 和 DiGraph 能够自然地表示加权图,并在边上存储任意信息。

  • Graph 和 DiGraph 都接受可选参数 weighted=True|False。当 weighted=True 时,图被假定为包含数字边数据(默认为 1)。早期版本的 Graph 和 DiGraph 类使用 Python None 作为数据(现在仍然允许作为边数据)。

  • Graph 和 DiGraph 类现在允许自环。

  • XGraph 和 XDiGraph 类已被移除,并替换为 MultiGraph 和 MultiDiGraph。MultiGraph 和 MultiDiGraph 可选地允许两个节点之间存在并行(多条)边。

新旧类的映射如下

- Graph -> Graph (self loops allowed now, default edge data is 1)
- DiGraph -> DiGraph (self loops allowed now, default edge data is 1)
- XGraph(multiedges=False) -> Graph
- XGraph(multiedges=True) -> MultiGraph
- XDiGraph(multiedges=False) -> DiGraph
- XDiGraph(multiedges=True) -> MultiDiGraph

方法变更#

edges()#

新关键字 data=True|False 决定是返回二元组 (u,v) (False) 还是三元组 (u,v,d) (True)

delete_node()#

首选名称现在是 remove_node()。

delete_nodes_from()#

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

delete_edge()#

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

delete_edges_from()#

首选名称现在是 remove_edges_from()。

add_edge()#

add_edge() 方法不再直接接受边元组 (u,v)。该元组必须解包为单独的节点。

>>> import networkx as nx
>>> u='a'
>>> v='b'
>>> e=(u,v)
>>> G=nx.Graph()

旧用法

>>> # G.add_edge((u,v))  # or G.add_edge(e)

新用法

>>> G.add_edge(*e) # or G.add_edge(*(u,v))

* 运算符在参数列表中解包边元组。

Add edge 现在有一个 data 关键字参数,用于设置默认(data=1)的边数据。

>>> # G.add_edge('a','b','foo')  # add edge with string "foo" as data
>>> # G.add_edge(1,2,5.0)  # add edge with float 5 as data

add_edges_from()#

现在可以接受包含二元组 (u,v)、三元组 (u,v,data) 或两者的混合列表或迭代器。

现在有一个 data 关键字参数(默认为 1),用于设置边列表中任何是二元组的边的边数据。

has_edge()#

has_edge() 方法不再直接接受边元组 (u,v)。该元组必须解包为单独的节点。

旧用法

>>> # G.has_edge((u,v))  # or has_edge(e)

新用法

>>> G.has_edge(*e) # or has_edge(*(u,v))
True

* 运算符在参数列表中解包边元组。

get_edge()#

现在有一个关键字参数“default”,用于指定如果未找到边时返回的值。如果未指定,则在未找到边时引发异常。

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

degree_iter()#

degree_iter 方法现在返回一个 (节点, 度) 对的迭代器。这是 degree_iter(with_labels=true) 之前的行为。此外,还有一个新的关键字 weighted=False|True 用于加权度。

subgraph()#

参数 inplace=False|True 已替换为 copy=True|False。

Subgraph 不再接受 create_using 关键字。要更改图类型,可以先复制图然后更改类型,或者先更改类型再创建子图。例如:

>>> G=nx.path_graph(5)
>>> H=nx.DiGraph(G.subgraph([0,1])) # digraph of copy of induced subgraph

__getitem__()#

使用 G[v] 从图中获取节点邻居现在返回一个字典。

>>> G=nx.path_graph(5)
>>> # G[0]
#  {1: 1}

要获取邻居列表,可以使用该字典的键或使用

>>> G.neighbors(0)  
[1]

此变更允许算法通过 G[v] 使用底层的字典嵌套字典表示来大幅提升性能。警告:返回的字典不应被修改,因为它可能破坏图的数据结构。如果要修改该字典,请创建一个副本 G[v].copy()。

移除的方法#

info()#

现在是一个函数

>>> G=nx.Graph(name='test me')
>>> nx.info(G)  
Name:                  test me
Type:                  Graph
Number of nodes:       0
Number of edges:       0

node_boundary()#

现在是一个函数

edge_boundary()#

现在是一个函数

is_directed()#

使用 directed 属性

>>> G=nx.DiGraph()
>>> # G.directed
#  True

G.out_edges()#

使用 G.edges()

G.in_edges()#

使用

>>> G = nx.DiGraph()
>>> R = G.reverse()
>>> R.edges()  
[]

>>> [(v,u) for (u,v) in G.edges()]
[]

添加的方法#

adjacency_list()#

返回图的列表嵌套列表邻接列表表示。

adjacency_iter()#

返回图所有节点上 (节点, adjacency_dict[节点]) 对的迭代器。旨在快速访问内部数据结构,用于内部算法。

与现有代码的其他潜在不兼容性#

导入#

部分代码模块已移至子目录。

导入语句,例如

import networkx.centrality
from networkx.centrality import *

可能不再有效(包括该示例)。

使用

>>> import networkx # e.g. centrality functions available as networkx.fcn()

>>> from networkx import * # e.g. centrality functions available as fcn()

自环#

对于 Graph 和 DiGraph,现在允许自环。这可能会影响那些添加自环并期望其被忽略的代码或算法。

使用方法

  • nodes_with_selfloops()

  • selfloop_edges()

  • number_of_selfloops()

以发现任何自环。

复制#

NetworkX 图的副本,包括使用 copy() 方法创建的副本,现在返回图的完整副本。这意味着所有连接信息都被复制——副本中的后续更改不会改变原始图。但是原始图和副本图中的节点键和边数据是指向相同数据的指针。

prepare_nbunch#

内部使用 - 现在称为 nbunch_iter 并返回一个迭代器。

将旧代码转换为 0.99 版本#

大多数情况下,只需运行代码,Python 就会对已更改的特性引发异常。常见的更改之处有:

  • 将 XGraph() 转换为 Graph 或 MultiGraph

  • 将 XGraph.edges() 转换为 Graph.edges(data=True)

  • 将一些很少使用的方法切换为属性(例如 directed)或函数(例如 node_boundary)

  • 如果你依赖于旧的默认边数据为 None,现在必须考虑它变为 1 的情况。

你可能还想检查代码中可以提高速度或可读性的地方。迭代器对于大型图很有帮助,通过 G[u][v] 获取边数据非常快。你可能还想将 G.neighbors(n) 更改为 G[n],后者返回以邻居节点为键、边数据为值的字典。它在许多用途中更快,但在更改图时效果不佳。