为3.0版本做准备#

备注

导致NetworkX 3.0版本的大部分工作将包含在NetworkX 2.6、2.7和2.8版本中。例如,我们在这些版本中弃用了许多旧代码。本指南将讨论这项正在进行的工作,并将帮助您了解现在可以进行哪些更改,以最大限度地减少迁移到3.0所造成的中断。

这是针对从NetworkX 2.x迁移到NetworkX 3.0的人员的指南

任何与这些有关的问题都可以在 mailing list .

3.0版本的重点是解决多年的技术债务,更新我们的代码库,提高性能,并使贡献变得更容易。我们计划在夏天发布3.0。

默认依赖项#

我们不再依赖“装饰者”库,因此NetworkX不再有任何依赖。然而,NetworkX 3.0包括了许多以与其他科学的Python库更紧密地集成为中心的更改和改进; numpyscipymatplotlib ,以及 pandas

NetworkX的核心功能不存在依赖关系,例如数据结构 (GraphDiGraph (等)和常见算法,但有些功能,例如 networkx.linalg 仅在安装了这些附加库的情况下才可用。

改进了与Science Python的集成#

NetworkX 3.0包括几项改进和现代化使用的更改 numpyscipy 在Networkx内部。

用数组替换NumPy/SciPy矩阵#

这个 numpy.matrix 由于明显偏离了 ndarray 接口,即:

  • 矩阵始终是二维的,这导致索引和广播等常见操作的结果不同。

  • 乘法运算符被解释为矩阵乘法而不是逐个元素的乘法。

这些差异使代码更难理解,并且通常需要样板才能使用多种格式。通过在Scipy版本1.8中添加稀疏数组接口,NetworkX 3.0取代了Scipy稀疏矩阵和NumPy矩阵的所有实例,以支持其对应的数组。任何返回以下任一项的函数 scipy.sparse.spmatrixnumpy.matrix 对象现在返回其对应的数组对等项 (scipy.sparse._sparraynumpy.ndarray 分别)和导致矩阵对象的显式转换函数已被删除(例如 to_numpy_matrix )。用户应该期待所有 numpyscipy.sparse 要遵守的对象 阵列 NetworkX 3.x中的语义。

对于某些算法,默认情况下切换到NumPy/SciPy实现#

一些网络x分析算法可以使用线性代数以非常高的性能实现,例如 pagerank 算法。在NetworkX 2.0中,有多个 pagerank 算法: pagerank (纯Python实现), pagerank_numpy (对于稠密邻接矩阵),以及 pagerank_scipy (稀疏邻接矩阵)。在所有实际用例中,SciPy实现远远优于其他实现。在NetworkX 3.0中, pagerank 函数现在默认使用SciPy实现。这意味着,打电话给 nx.pagerank 现在需要安装SciPy。原始的Python实现仍可用于教学目的,如下所示 networkx.algorithms.link_analysis.pagerank_alg._pagerank_python 但不会公开曝光,以阻止它的使用。

支座 numpy.random.Generator#

NumPy v1.17引入了一个新的伪随机数生成接口。这个 py_random_statenp_random_state 装饰者已经增加了对新的 numpy.random.Generator 实例;换句话说, seed 参数现在接受 numpy.random.Generator 实例::

>>> G = nx.barbell_graph(6, 2)
>>> pos = nx.spring_layout(G, seed=np.random.default_rng(123456789))

这个 numpy.random.Generator 界面在原始版本的基础上进行了多项改进 numpy.random.RandomState 包括更好的统计特性和改进的性能。然而, Generator 与流不兼容 RandomState 并且不保证与未来版本的NumPy的流兼容性。因此,最佳做法是在使用随机数生成器时明确表示。保证 精确 随机数在所有版本的NetworkX(过去和未来)中的可重复性, RandomState 建议使用::

>>> rng = np.random.RandomState(12345)
>>> pos = nx.spring_layout(G, seed=rng)

对于精确的流可重现性不那么重要的新代码, Generator 建议使用::

>>>> rng = np.random.default_rng(12345)
>>> pos = nx.spring_layout(G, seed=rng)

备注

随机数的精确再现性 Generator 仍有可能,但可能需要安装特定版本的NumPy。

多属性邻接矩阵的NumPy结构化数据类型#

在NetworkX 3.0之前,多属性邻接矩阵通过 nx.to_numpy_recarray 转换函数。 numpy.recarray 是一种方便的包装 ndarray 具有结构化数据类型。因此,NetworkX 3.0中删除了此转换功能,并添加了对结构化数据类型的支持 to_numpy_array 相反,对多属性邻接的数组表示支持的总体改进如下:

>>> import numpy as np
>>> edges = [
...     (0, 1, {"weight": 10, "cost": 2}),
...     (1, 2, {"weight": 5, "cost": 100})
... ]
>>> G = nx.Graph(edges)
>>> # Create an adjacency matrix with "weight" and "cost" attributes
>>> dtype = np.dtype([("weight", float), ("cost", int)])
>>> A = nx.to_numpy_array(G, dtype=dtype, weight=None)
>>> A
array([[( 0.,   0), (10.,   2), ( 0.,   0)],
       [(10.,   2), ( 0.,   0), ( 5., 100)],
       [( 0.,   0), ( 5., 100), ( 0.,   0)]],
      dtype=[('weight', '<f8'), ('cost', '<i8')])
>>> A["cost"]
array([[  0,   2,   0],
       [  2,   0, 100],
       [  0, 100,   0]])
>>> # The recarray interface can be recovered with ``view``
>>> A = nx.to_numpy_array(G, dtype=dtype, weight=None).view(np.recarray)
>>> A
rec.array([[( 0.,   0), (10.,   2), ( 0.,   0)],
           [(10.,   2), ( 0.,   0), ( 5., 100)],
           [( 0.,   0), ( 5., 100), ( 0.,   0)]],
          dtype=[('weight', '<f8'), ('cost', '<i8')])
>>> A.weight
array([[ 0., 10.,  0.],
       [10.,  0.,  5.],
       [ 0.,  5.,  0.]])

不推荐使用的代码#

2.6版不推荐使用30多个函数。看见 网络X 2.6

--

功能 read_gpicklewrite_gpickle 将在3.0中删除。您可以将NetworkX图形作为Python Pickle进行读写。

>>> import pickle
>>> G = nx.path_graph(4)
>>> with open('test.gpickle', 'wb') as f:
...     pickle.dump(G, f, pickle.HIGHEST_PROTOCOL)
...
>>> with open('test.gpickle', 'rb') as f:
...     G = pickle.load(f)
...

功能 read_yamlwrite_yaml 将在3.0中删除。您可以使用pyyaml以YAML格式读取和写入NetworkX图形。

>>> import yaml
>>> G = nx.path_graph(4)
>>> with open('test.yaml', 'w') as f:
...     yaml.dump(G, f)
...
>>> with open('test.yaml', 'r') as f:
...     G = yaml.load(f, Loader=yaml.Loader)