NetworkX 2.0#

发布日期:2017年9月20日

添加了对 Python 3.6 的支持,放弃了对 Python 3.3 的支持。

参见1.X 到 2.0 的迁移指南

NetworkX 是一个用于创建、操作和研究复杂网络结构、动力学和功能的 Python 包。

欲了解更多信息,请访问我们的网站和我们的示例库。如有意见和问题,请发送至networkx-discuss 邮件列表

亮点#

此版本是两年多工作成果,由 86 位贡献者贡献了 1212 次提交和 193 次合并。亮点包括

  • 我们对 Multi/Di/Graph 类中的方法进行了重大更改。这里提供了一个1.X 到 2.0 的迁移指南

  • 我们更新了文档系统。

API 变更#

  • 基础图类变更 随着 NetworkX 2.0 的发布,我们正朝着视图/迭代器报告 API 发展。过去,图的同一属性有两个方法,一个返回列表,一个返回迭代器。在 2.0 中,我们用视图取代了它们。视图是一个只读对象,创建速度快,自动更新,并在适当的情况下提供迭代、成员检查和集合操作等基本访问。例如,G.nodes() 曾经返回一个列表,G.nodes_iter() 返回一个迭代器。现在 G.nodes() 返回一个视图,并且 G.nodes_iter() 已被移除。G.degree() 返回一个带有 (node, degree) 迭代的视图,因此 dict(G.degree()) 返回一个以节点为键、度数为值的字典。旧的行为

    >>> G = nx.complete_graph(5)
    >>> G.nodes()  
    [0, 1, 2, 3, 4]
    >>> G.nodes_iter()  
    <dictionary-keyiterator at ...>
    

    已更改为

    >>> G = nx.complete_graph(5)
    >>> G.nodes()
    NodeView((0, 1, 2, 3, 4))
    >>> list(G.nodes())
    [0, 1, 2, 3, 4]
    

    新功能包括从视图中查找节点和边数据、不带括号的属性访问以及集合操作。

    >>> G.add_node(3, color='blue')
    >>> G.nodes[3]
    {'color': 'blue'}
    >>> G.nodes & {3, 4, 5}
    {3, 4}
    

    以下方法已更改

    • Graph/MultiGraph

      • G.nodes()

      • G.edges()

      • G.neighbors()

      • G.adjacency_list()G.adjacency_iter() 变更为 G.adjacency()

      • G.degree()

      • G.subgraph()

      • G.copy()

      • G.__class__() 应替换为 G.fresh_copy()

    • DiGraph/MultiDiGraph

      • G.nodes()

      • G.edges()

      • G.in_edges()

      • G.out_edges()

      • G.degree()

      • G.in_degree()

      • G.out_degree()

      • G.reverse()

    以下已弃用的方法将在未来版本(3.0?)中移除。
    • G.node, G.edge (已被 G.nodes, G.edges 替换)

    • G.add_path, G.add_cycle, G.add_star (现为 nx.add_path(G,...))

    • G.selfloop_edges, G.nodes_with_selfloops, G.number_of_selfloops (现为 nx.selfloop_edges(G) 等)

    许多子类也相应地进行了更改,例如
    • AntiGraph

    • OrderedGraph 及其相关类

    • 继承自 Graph 的 ThinGraph 等示例

  • [#2107] Graph 类方法 add_edgeadd_edges_from 不再允许使用 attr_dict 参数。请改用关键字参数。因此 G.add_edge(1, 2, {'color': 'red'}) 变为 G.add_edge(1, 2, color='red')。请注意,这仅适用于属性名称是字符串的情况。对于非字符串属性,您需要先添加边,然后使用例如 G.edges[1, 2].update({0: "zero"}) 手动更新。

  • [#1577] 除了最小生成树之外,现在还提供了计算最大生成树的新函数。新的 API 包含四个函数:minimum_spanning_edgesmaximum_spanning_edgesminimum_spanning_treemaximum_spanning_tree。所有这些函数都接受一个 algorithm 参数,该参数指定在查找最小或最大生成树时使用的算法。目前实现了 Kruskal 算法和 Prim 算法,分别定义为 'kruskal' 和 'prim'。如果未指定,则使用 Kruskal 算法。例如,要使用 Kruskal 算法计算图的最大生成树,需要像这样调用 maximum_spanning_tree 函数

    >>> nx.maximum_spanning_tree(G, algorithm='kruskal')
    

    algorithm 参数是新增的,并且出现在现有 weight 参数之前。因此,未明确命名可选 weight 参数的现有代码需要进行更新

    >>> nx.minimum_spanning_tree(G, 'mass')  # old
    >>> nx.minimum_spanning_tree(G, weight='mass') # new
    

    在上面示例中,我们仍然依赖于将函数导入到顶级命名空间。我们目前没有立即弃用这种方法的计划,但我们建议改用以下方式

    >>> from networkx.algorithms import tree
    # recommended
    >>> tree.minimum_spanning_tree(G, algorithm='kruskal', weight='mass')
    >>> tree.minimum_spanning_edges(G, algorithm='prim', weight='mass')
    
  • [#1445] 大多数 shortest_path 算法在源或目标不在图中时,现在会引发 NodeNotFound 异常。

  • [#2326] 中心性算法在权重参数的默认行为方面进行了统一。weight 关键字参数的默认值已从 weight 更改为 None。这会影响以下中心性函数

    • approximate_current_flow_betweenness_centrality()

    • current_flow_betweenness_centrality()

    • current_flow_betweenness_centrality_subset()

    • current_flow_closeness_centrality()

    • edge_current_flow_betweenness_centrality()

    • edge_current_flow_betweenness_centrality_subset()

    • eigenvector_centrality()

    • eigenvector_centrality_numpy()

    • katz_centrality()

    • katz_centrality_numpy()

  • [#2420] 提供了新的社区检测算法。Fluid Communities 是一种异步算法,基于流体在环境中相互作用、扩张和相互推动的简单想法。该算法在“Fluid Communities: A Competitive and Highly Scalable Community Detection Algorithm”中描述。

  • [#2510#2508] 当指定 target 时,single_source_dijkstramulti_source_dijkstra 以及使用这些函数的行为有所改变。不再返回距离和路径的字典,而是返回一个包含 (distance, path) 的 2 元组。当未指定 target 时,返回值仍然是 2 个字典。

  • [#2553] set_node_attributes()set_edge_attributes() 现在除了接受之前有效的输入形式:{node/edge: value}value 外,还接受 {node/edge: {name: value}} 形状的字典输入。参数顺序也发生了变化:第二个参数“values”是值参数,第三个参数“name”是属性名称。“name”的默认值为 None,在这种情况下,“values”必须是新允许的包含名称的形式。之前“name”排在第二位且没有默认值,“values”排在第三位。

  • [#2604] 将自环方法从基类移至 networkx 函数。G.number_of_selfloops()G.selfloop_edges()G.nodes_with_selfloops() 现在是 nx.number_of_selfloops(G)nx.selfloop_edges(G)nx.nodes_with_selfloops(G)

    G.nodeG.edge 已被移除。它们的功能已被 G.nodesG.edges 取代。

  • [#2558] 之前,函数 from_pandas_dataframe 假设数据框具有类似边的列表结构,而 to_pandas_dataframe 生成邻接矩阵。我们现在提供了四个函数:from_pandas_edgelistto_pandas_edgelistfrom_pandas_adjacencyto_pandas_adjacency

  • [#2620] 移除了 draw_nx,请使用 drawdraw_networkx

  • [#1662] 将 topological_sort 重写为生成器。它不再接受 reversenbunch 参数,并且速度稍快。添加了 lexicographical_topological_sort,该函数接受一个键。

弃用项#

以下已弃用的函数将在 2.1 版本中移除。

  • 函数 bellman_ford 已被弃用,推荐使用 bellman_ford_predecessor_and_distance

  • 函数 to_pandas_dataframefrom_pandas_dataframe 已被弃用,推荐使用 to_pandas_adjacencyfrom_pandas_adjacencyto_pandas_edgelistfrom_pandas_edgelist

贡献者#

  • Niels van Adrichem

  • Kevin Arvai

  • Ali Baharev

  • Moritz Emanuel Beber

  • Livio Bioglio

  • Jake Bogerd

  • Moreno Bonaventura

  • Raphaël Bournhonesque

  • Matthew Brett

  • James Clough

  • Marco Cognetta

  • Jamie Cox

  • Jon Crall

  • Robert Davidson

  • Nikhil Desai

  • DonQuixoteDeLaMancha

  • Dosenpfand

  • Allen Downey

  • Enrico

  • Jens Erat

  • Jeffrey Finkelstein

  • Minas Gjoka

  • Aravind Gollakota

  • Thomas Grainger

  • Aric Hagberg

  • Harry

  • Yawara ISHIDA

  • Bilal AL JAMMAL

  • Ryan James

  • Omer Katz

  • Janis Klaise

  • Valentin Lorentz

  • Alessandro Luongo

  • Francois Malassenet

  • Arya McCarthy

  • Michael-E-Rose

  • Peleg Michaeli

  • Jarrod Millman

  • Chris Morin

  • Sanggyu Nam

  • Nishant Nikhil

  • Rhile Nova

  • Ramil Nugmanov

  • Juan Nunez-Iglesias

  • Pim Otte

  • Ferran Parés

  • Richard Penney

  • Phobia

  • Tristan Poupard

  • Sebastian Pucilowski

  • Alexander Rodriguez

  • Michael E. Rose

  • Alex Ryan

  • Zachary Sailer

  • René Saitenmacher

  • Felipe Schneider

  • Dan Schult

  • Scinawa

  • Michael Seifert

  • Mohammad Hossein Sekhavat

  • Mridul Seth

  • SkyTodInfi

  • Stacey Smolash

  • Jordi Torrents

  • Martin Törnwall

  • Jannis Vamvas

  • Luca Verginer

  • Prayag Verma

  • Peter Wills

  • Ianto Lin Xi

  • Heqing Ya

  • aryamccarthy

  • chebee7i

  • definitelyuncertain

  • jfinkels

  • juliensiebert

  • leotrs

  • leycec

  • mcognetta

  • numpde

  • root

  • salotz

  • scott-vsi

  • thegreathippo

  • vpodpecan

  • yash14123

  • Neil Girdhar

已合并的 PR#

  • Gml 读取修复。(#1962)

  • #1847 遗留的小更改(#1966)

  • 修复有向图的 k_core。添加测试(#1963)

  • 可传播性修复(#1958)

  • 允许在最短路径函数中使用权重函数(#1690)

  • weighted.py 的微小文档更改(#1969)

  • 修复 minimum_st_edge_cut 文档。(#1977)

  • 修复 all_node_cuts 的边界情况:环图和完全图。(#1976)

  • 将 add_path/star/cycle 从方法改为函数(#1970)

  • @jfinkels 的分支“edge-subgraph”(#1740)

  • 修正 eppstein 匹配(#1955)

  • Nose 忽略文档字符串(#1980)

  • 编辑了 Doc Makefile,以便 clean 命令不删除 examples 文件夹(#1967)

  • convert_matrix.py 中的错误修复(#1983)

  • 避免在 pagerank_numpy 中不必要的特征值排序(#1986)

  • 修复 install.rst 中的一个拼写错误(#1991)

  • 添加 dag_longest_path 的不可排序节点测试。(#1999)

  • 改进绘图测试脚本(拼写错误、换行、方法)(#1992)

  • 改进 A* 最短路径的测试覆盖率。(#1988)

  • 改进平均度连接的测试覆盖率(#1987)

  • 修复 Graph() 文档字符串以反映输入灵活性(#2006)

  • 修复 sphinx autosummary 文档生成错误。(#2026)

  • 改进 gexf.py(#2010)

  • Readme.rst 应提及需要 Decorator 包。(#2009)

  • fix_duplicate_kwarg:修复导致 to_agraph... 的重复关键字参数(#2005)

  • 清理 graph6 和 sparse6 I/O 的文档。(#2002)

  • 移除 http 服务器示例(#2001)

  • 泛化并改进 node_link.py 的文档字符串(#2000)

  • 修复问题 #1948 和 PEP8 格式(#2031)

  • 在 dijkstra_path_length 中使用权重函数。(#2033)

  • 将 sphinx 的默认角色更改为 'obj'(#2027)

  • 修复拼写错误 s/abritrary/arbitrary/(#2035)

  • 修复 dtype 值矩阵中的错误(#2038)

  • 添加使用带有默认值的 Graph.nodes() 的示例(#2040)

  • 澄清 relabel_nodes() 的一些示例。(#2041)

  • 清理图幂的代码和文档。(#2042)

  • 清理 classes.function 模块。(#2043)

  • 当使用空图调用时出现 UnboundLocalError(#2047)

  • 标准化 Bellman-Ford 函数调用(#1910)

  • IRC 中没有人(#2059)

  • 在 MST 测试中使用 add_weighted_edges_from 函数。(#2061)

  • 添加多源 Dijkstra 算法(#2073)

  • 添加 Voronoi 单元格算法(#2074)

  • 修复 Girvan-Newman 划分函数的几个问题。修复 #1703、#1725、#1799(#1972)

  • 将 is_path 从 utils 移至 simple_paths。(#1921)

  • 为 numpy 版本添加 max_iter 和 tol 参数(#2013)

  • 移除 draw_graphviz 函数。修复 #1997(#2077)

  • 修复 #1998 edge_load 函数需要文档。(#2075)

  • 更新 fixcoverage.py(#2080)

  • 在近似最小顶点覆盖中支持有向图(#2039)

  • 简化贪心着色函数的代码。(#1680)

  • 允许在几何生成器中使用任意度量。(#1679)

  • 修复单节点图的 spring_layout。(#2081)

  • 更新 set_{node,edge}_attributes 和文档。(#1935)

  • 修复最大匹配的测试。(#1919)

  • 添加用于社区的 LFM 基准图生成器(#1727)

  • 添加全局和局部效率函数。(#1521)

  • 将 alphas 应用于单个节点(#1289)

  • 瞬态 VF2 的代码和测试(#1653)

  • 扩展 gexf.py 和 graphml.py 中的 convert_bool 以支持所有有效的布尔值(#1063)

  • 移除编码的 … 为纯 ascii(#2086)

  • 对 in_degree_centrality() 和 out_degree_centrality() 使用 not_implemented_for()(#2084)

  • 问题 2072 加权模块化(#2088)

  • 简化特征向量中心性的实现。(#1708)

  • Fjmalass 节点作为元组(#2089)

  • 生成器重命名(#2090)

  • 确保文档“另请参见”部分中的链接(#2082)

  • 文档化仅整数的数字混合(#2085)

  • 文档 sphinx 错误移除(#2091)

  • 修正“另请参见”链接(#2095)

  • 调整 layout.py 函数签名、文档、公开(#2096)

  • 添加缺失的 __all__ 属性。(#2098)

  • 修复支配边界代码中的 2 个错误(#2092)

  • 创建了两个新文件:joint_degree_seq.py 和 test_joint_degree_seq.…(#2011)

  • 添加 Borůvka 最小生成树算法。(#1873)

  • 添加全局/局部可达中心性函数。(#2099)

  • 移除 #1894 的冲突(更新异常类)(#2100)

  • 在 shortest_path 中为缺失的源添加异常(#2102)

  • compose 的文档现在警告 MultiGraph edgekeys 的问题(#2101)

  • 改进 simplex 及其相关类文档中的“注意”部分。(#2104)

  • 添加用于最大流问题的 Dinitz 算法。(#1978)

  • 移除重复的方法/文档 (add_edges_from) (#1)

  • 修复 generic_multiedge_match 的错误(问题 #2114)(#2124)

  • 修复 2015 的问题。(#2)

  • add_node, add_edge attr_dict 更改。(#2132)

  • 在 relabel_nodes 中处理图名称属性(#2136)

  • 修复 fruchterman reingold 错误并为布局添加更多测试。(#2141)

  • 添加异常:幂迭代收敛失败(#2143)

  • 微调 HITS 的迭代逻辑(#2142)

  • 修复 PageRank personalize 文档字符串(#2148)

  • 为 dfs_tree 设置默认 source=None(#2149)

  • 修复 maximal_matching 和 tensor_product 的文档(#2158)

  • 在多重图中隔离边键生成(#2150)

  • 将中心性一起排序并外包离散度计算(#2083)

  • 将经典生成器更改为使用生成器而不是列表(#2167)

  • 添加带有示例的波束搜索遍历算法(#2129)

  • Turan 图(#2172)

  • 从文档字符串中移除不相关的“注意”部分(#2178)

  • 修正示例中的对数底数(#2179)

  • 文档中的小修正(#2180)

  • 添加用于最大流问题的 Boykov Kolmogorov 算法。(#2122)

  • 测试运行后删除临时文件。(#2202)

  • 在 convert_matrix.to_scipy_sparse_matrix 中添加对没有边的子图的支持。(#2199)

  • 在 readwrite.pajek.parse_pajek 中添加对读取邻接矩阵的支持。(#2200)

  • 将 Graph Atlas 移至数据文件。(#2064)

  • 重构 Dinitz 算法实现。(#2196)

  • 在 scipy.linalg.expm() 中使用数组代替矩阵(#2208)

  • 使 in_edges 等效于 out_edges(#2206)

  • 修复因排序问题导致测试失败。(#2207)

  • 修复代码转义。(#2214)

  • 添加 adjlist_outer_dict_factory。(#2222)

  • 无标度网络生成器文档中的拼写错误(#2225)

  • 添加到 nx.drawing.layout 的链接,而不是提及 nx.layout。(#2224)

  • 教程中的示例无法工作(#2230)

  • 在运行 dag_longest_path 时不要假设节点是可排序的(#2228)

  • 修正拼写错误(#2236)

  • 计算局部效率时使用 ego graph(#2246)

  • 使调和中心性更节省内存(#2247)

  • 使 dag_longest_path_length 返回路径长度,而不是边数(#2237)

  • 在 dag 中添加了 transitive_reduction(#2215)

  • pylab 标签绘制中未使用 alpha 关键字参数,已在此处添加。(#2269)

  • 让 PyDot 支持重振旗鼓(#2272)

  • katz_centrality_numpy 中不必要的数组复制?(#2287)

  • 切换到更快的最小最后算法实现。(#2268)

  • 添加获取所有简单边路径的示例。修复 #718(#2260)

  • 移除过时的测试工具。(#2303)

  • 修正 minimum_spanning_arborescence 中的错误(#2285)

  • 在 dfs_labeled_edges 中生成字符串,而不是字典。(#2277)

  • 移除不必要的 convert_to_(un)directed 函数(#2259)

  • 完成多部分图文档(#2221)

  • 修复 LPA 错误,参见 issues/2219(#2227)

  • 广义度数(#2220)

  • Turan 文档(#2218)

  • 修复 P2G 格式描述的断开链接。(#2211)

  • 测试排序(#2209)

  • 添加节点权重示例(#2250)

  • 添加参数 nbunch(#2253)

  • 添加使用 dtype 与 to_numpy_matrix 的单元测试(#2257)

  • 添加链分解算法。(#2284)

  • 添加 Hoffman-Singleton 图(#2275)

  • 允许 grid_graph 生成器接受元组 dim 参数(#2320)

  • pseudo -> pseudo (修复拼写错误)(#2322)

  • 修正可导航小世界图参数文档(#2321)

  • 修复 find_cycle 中的错误。(#2324)

  • 翻转源目标(#2309)

  • digitsrep(..) 函数的更简单版本(#2330)

  • 更改 articulation_points 使其每个顶点只返回一次(#2333)

  • 使用更快的随机几何图实现。(#2337)

  • 允许 community asyn_lpa 测试有两个答案(#2339)

  • 修复断开的链接并从 Makefile 中移除 pdf 文件(#2344)

  • 文档化 isom 的可排序节点要求。(#2302)

  • 添加社区模块化度量。(#1729)

  • 简化度序列图生成器。(#1866)

  • 添加树编码和解码函数。(#1874)

  • 修正有向图的 number_of_edges 文档(#2360)

  • 为欧拉环路添加多重图键(#2359)

  • 更新边子图中的前驱/后继(#2373)

  • 修复 #2364 的问题(#2372)

  • 在 bipartite.sets 中为非连通图引发异常(#2375)

  • 修复 NetworkXNotImplemented 中的拼写错误(#2385)

  • 在 to_vertex_cover 中使用迭代 DFS 检查交替路径。(#2386)

  • 修复在 networkx.linalg.graphmatrix.incidence_matrix 中生成 NXError 时的拼写错误(#2395)

  • [修复 #2342] 移除对 plt.hold() 的调用,该函数在 mpl2.0 中已弃用(#2397)

  • 修复断开的链接(#2414)

  • 修复所有 3.6 的测试(#2413)

  • 改进二分图文档。(#2402)

  • 修正 GEXFWriter 中的逻辑(#2399)

  • 在 setup.py 中列出可选依赖项(#2398)

  • Gitwash 更新(#2371)

  • 添加 cytoscape JSON 处理(#2351)

  • 修复问题 #2328 和 #2332(#2366)

  • 解决 travis 上 gdal python3.6 的问题并修复更多 doctest(#2416)

  • 修复自定义 attrs 使用中的错误:字典没有 iteritems 方法。(#2461)

  • 修复 sphinx 错误和类大纲(#2480)

  • 注意图是有向无环图的前提条件(#2500)

  • 添加 CONTRIBUTE 文件(#2501)

  • 移除外部模块(#2521)

  • 确保 make html 在退出时不会导致构建失败(#2530)

  • 精选缺失的提交(#2535)

  • 文档化发布过程(#2539)

  • 更新版权(#2551)

  • 移除已弃用的代码(#2536)

  • 改进文档(#2555)

  • WIP:添加关于如何估算适当 alpha 值的说明(#2583)

  • Travis 重构(#2596)

  • 创建用于边列表和邻接矩阵的 df 的单独函数(#2558)

  • math_dollar 使用 texext(#2609)

  • 添加绘图测试(#2617)

  • 添加阈值测试(#2622)

  • 更新文档(#2623)

  • 准备 beta 版本发布(#2624)

  • 重构 travis 测试并使用 travis 部署文档(#2647)

  • matplotlib 2.1 弃用了 is_string_like(#2659)

  • topological_sort, lexicographical_topological_sort(#1662)