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/
实验性的 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],后者返回以邻居节点为键、边数据为值的字典。它在许多用途中更快,但在更改图时效果不佳。