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

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

Bug修复#

  • 正确处理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(现在允许自环,默认边缘数据为1)
- DiGraph -> DiGraph(现在允许自环,默认边缘数据为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()。

remove_edge()#

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

remove_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))  # 或 G.add_edge(e)

新版

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

*操作符在参数列表中解包边元组。

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

>>> # G.add_edge('a','b','foo')  # 添加带有字符串“foo”作为数据的边
>>> # G.add_edge(1,2,5.0)  # 添加带有浮点数5作为数据的边

add_edges_from()#

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

现在有数据关键字参数(默认为1)用于为边列表中任何2元组设置边数据。

has_edge()#

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

旧版:

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

新版:

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

*操作符在参数列表中解包边元组。

get_edge()#

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

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

degree_iter()#

degree_iter方法现在返回(node, degree)对的迭代器。这是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])) # 复制诱导子图的有向图

__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()#

返回一个迭代器,遍历图中所有节点及其邻接字典[node]。用于快速访问内部数据结构,供内部算法使用。

与现有代码可能不兼容的其他情况#

导入#

一些代码模块已移动到子目录中。

导入语句如下:

import networkx.centrality
from networkx.centrality import *

可能不再起作用(包括此示例)。

可以使用以下方式之一

>>> import networkx # 例如,centrality函数可作为networkx.fcn()使用

>>> from networkx import * # 例如,centrality函数可直接作为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],它返回以邻居节点为键的边数据字典。对于许多目的来说,这样做更快,但在更改图形时效果不佳。