NetworkX 2.0#

发布日期:2017年9月20日

添加对Python 3.6的支持,不再支持Python 3.3。

查看:从1.x迁移到2.0的迁移指南

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

更多信息,请访问我们的 网站 和我们的 示例库 。请将评论和问题发送到 networkx-discuss邮件列表

亮点#

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

API更改#

  • 基本图类更改 随着NetworkX 2.0的发布,我们正在转向视图/迭代器报告API。我们过去针对图的相同属性有两种方法,一种返回列表,一种返回迭代器。在2.0中,我们用视图替换了它们。视图是一个只读对象,创建快速,自动更新,并在适当的情况下提供基本访问,如迭代、成员资格和集合操作。例如, G.nodes() 过去返回一个列表, G.nodes_iter() 返回一个迭代器。现在 G.nodes() 返回一个视图, G.nodes_iter() 被移除。 G.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_edges , maximum_spanning_edges , minimum_spanning_tree , 和 maximum_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')  # 旧
    >>> nx.minimum_spanning_tree(G, weight='mass') # 新
    

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

    >>> from networkx.algorithms import tree
    # 推荐
    >>> 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” <https://arxiv.org/pdf/1703.09307.pdf>》中完全描述。

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

  • [ #2553 ] set_node_attributes()set_edge_attributes() 现在接受形状为 {node/edge: {name: value}} 的字典输入,除了之前有效的输入形式: {node/edge: value}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_edgelist , to_pandas_edgelist , from_pandas_adjacency , 和 to_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…的重复kwarg。 (#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)

  • 使用not_implemented_for()处理in_degree_centrality()和out_degree_centrality() (#2084)

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

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

  • 将节点作为元组处理 (#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 边键 (#2101)

  • 改进 simplex 和相关文档中的 Notes 部分。 (#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 的错误并为 layouts 添加更多测试。 (#2141)

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

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

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

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

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

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

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

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

  • 添加了带有示例的 beam search 遍历算法 (#2129)

  • Turan 图 (#2172)

  • 从文档字符串中删除无关的 Notes 部分 (#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 图 (#2246)

  • 使 harmonic centrality 更节省内存 (#2247)

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

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

  • pylab 标签绘制中未使用 alpha kwarg,此处添加。 (#2269)

  • 使 PyDot 再次支持良好 (#2272)

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

  • 切换到更快的 smallest-last 算法实现。 (#2268)

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

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

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

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

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

  • 完善multipartite图文档。(#2221)

  • 修复LPA bug,参见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)

  • 伪->伪(修正拼写错误)。(#2322)

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

  • 修复find_cycle中的bug。(#2324)

  • 翻转源目标。(#2309)

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

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

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

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

  • 修复损坏的链接并从Makefile中删除pdf文件。(#2344)

  • 为isom文档排序节点要求。(#2302)

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

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

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

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

  • 为Eulerian circuits添加多图键。(#2359)

  • 在边子图中更新predecessors/successors。(#2373)

  • 修复#2364中的bug。(#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提供解决方法以及更多doctests修复。(#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)

  • 使用texext进行数学公式的美元符号 (#2609)

  • 添加绘图测试 (#2617)

  • 添加阈值测试 (#2622)

  • 更新文档 (#2623)

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

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

  • matplotlib 2.1 已弃用 is_string_like (#2659)

  • topological_sort, lexicographical_topological_sort (#1662)