为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库更紧密地集成为中心的更改和改进; numpy
, scipy
, matplotlib
,以及 pandas
。
NetworkX的核心功能不存在依赖关系,例如数据结构 (Graph
, DiGraph
(等)和常见算法,但有些功能,例如 networkx.linalg
仅在安装了这些附加库的情况下才可用。
改进了与Science Python的集成#
NetworkX 3.0包括几项改进和现代化使用的更改 numpy
和 scipy
在Networkx内部。
-
删除的所有使用
numpy.matrix
赞成numpy.ndarray
。领养Scipy.Sparse 阵列 接口。
NumPy or SciPy implementations of some algorithms by default (e.g. pagerank).
numpy.random.Generator
support for random number generation.Replace recarray support with more generic support for structured dtypes.
用数组替换NumPy/SciPy矩阵#
这个 numpy.matrix
由于明显偏离了 ndarray
接口,即:
矩阵始终是二维的,这导致索引和广播等常见操作的结果不同。
乘法运算符被解释为矩阵乘法而不是逐个元素的乘法。
这些差异使代码更难理解,并且通常需要样板才能使用多种格式。通过在Scipy版本1.8中添加稀疏数组接口,NetworkX 3.0取代了Scipy稀疏矩阵和NumPy矩阵的所有实例,以支持其对应的数组。任何返回以下任一项的函数 scipy.sparse.spmatrix
或 numpy.matrix
对象现在返回其对应的数组对等项 (scipy.sparse._sparray
和 numpy.ndarray
分别)和导致矩阵对象的显式转换函数已被删除(例如 to_numpy_matrix
)。用户应该期待所有 numpy
和 scipy.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_state
和 np_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_gpickle
和 write_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_yaml
和 write_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)