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],它返回以邻居节点为键的边数据字典。对于许多目的来说,这样做更快,但在更改图形时效果不佳。