ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

NetworkX 3.0 迁移指南:从 2.X 到 3.0 的破坏性变更与升级实战

NetworkX 3.0 迁移指南:从 2.X 到 3.0 的破坏性变更与升级实战 NetworkX 3.0 迁移指南从 2.X 到 3.0 的破坏性变更与升级实战【免费下载链接】networkxNetwork Analysis in Python项目地址: https://gitcode.com/gh_mirrors/ne/networkx导读本文基于 doc/release/migration_guide_from_2.x_to_3.0.rst 整理系统讲解从 NetworkX 2.X 升级到 3.0 时必须了解的破坏性变更NumPy/SciPy 矩阵被数组语义全面取代、pagerank默认切换到 SciPy 实现、随机数接口支持numpy.random.Generator、多属性邻接矩阵改用结构化 dtype以及read_gpickle/write_gpickle、read_yaml/write_yaml等函数的移除。读完本文你将能对照迁移清单逐项改造现有代码平滑升级到 3.0 及之后版本。说明迁移指南本身是面向 3.0 的规划与变更记录其中大量弃用动作是在 2.6、2.7、2.8 三个中间版本陆续落地的3.0 的正式发布日期为 2023 年 1 月 7 日支持 Python 3.8–3.11见 doc/release/release_3.0.rst。3.0 的总体目标偿还技术债与现代化迁移指南明确写道3.0 的发布聚焦于偿还多年积累的技术债务technical debt、现代化代码库、提升性能并降低贡献门槛。理解这一目标有助于解释为什么 3.0 会有一批不兼容的改动——它们绝大多数是为了消除历史遗留的设计问题移除被官方长期不推荐的numpy.matrix/scipy.sparse矩阵接口全面转向ndarray/ sparsearray语义把性能更好的线性代数实现如pagerank的 SciPy 版本设为默认拥抱 NumPy 新一代随机数接口numpy.random.Generator用更通用的结构化 dtype 替代专用的 recarray 支持清理一批与第三方库职责重叠的 IO 函数pickle、YAML。这些改动同时改善了与科学计算生态numpy、scipy、matplotlib、pandas的集成这也正是 3.0 及后续版本的发展方向。默认依赖变化核心零依赖科学计算为可选增强迁移指南明确NetworkX 3.0 不再依赖decorator库因此 NetworkX 本身没有任何强制依赖。这意味着核心数据结构Graph、DiGraph、MultiGraph、MultiDiGraph和常见算法可以脱离任何第三方库直接使用部分功能例如 networkx/linalg 包中的矩阵相关函数只有在安装了numpy、scipy等库后才可用。但 3.0 同时做了大量与科学计算生态更紧密集成的改进因此实际使用中numpy、scipy、matplotlib、pandas仍是最常见的伴随依赖。当前仓库的依赖约束文件 requirements/default.txt 中列出了numpy2与scipy1.13反映了仓库在当前版本下的配套要求具体以你所安装的 NetworkX 版本为准。核心变更一NumPy/SciPy 矩阵全面替换为数组为什么必须替换numpy.matrixnumpy.matrix长期被 NumPy 官方不推荐使用原因是它与ndarray的接口存在显著分歧矩阵永远是二维的索引和广播broadcasting行为与普通数组不同导致同样的操作在不同维度输入下结果不一致乘法运算符语义不同*在矩阵上被解释为矩阵乘法而不是逐元素乘法。这两点差异让代码难以阅读并经常需要大量样板代码来兼容多种数据格式。3.0 的替换动作随着 scipy 1.8 引入sparse array接口NetworkX 3.0 得以将所有scipy.sparse矩阵和numpy矩阵替换为对应的数组版本旧接口已移除新接口3.0 起scipy.sparse.spmatrix对象scipy.sparse._sparraysparse arraynumpy.matrix对象numpy.ndarraynx.to_numpy_matrix等显式矩阵转换函数已删除改用数组语义转换具体到当前仓库源码矩阵时代的转换入口已彻底消失对 networkx/convert_matrix.py 的检索确认to_numpy_matrix、to_scipy_sparse_matrix、to_numpy_recarray均已不存在取而代之的是to_scipy_sparse_array(G, nodelistNone, dtypeNone, weightweight, formatcsr)convert_matrix.py返回图的邻接sparse array默认格式为 CSRto_numpy_array(G, nodelistNone, dtypeNone, orderNone, multigraph_weightsum, weightweight, nonedge0.0)convert_matrix.py返回图的邻接ndarray。升级要点3.X 中所有numpy和scipy.sparse对象都应按照array语义来对待。如果你的代码里出现了A * B期望矩阵乘法或.I、.H、.A之类的矩阵专属用法需要改写为A B、np.linalg.inv等数组化写法。核心变更二pagerank默认切换到 SciPy 实现背景三个实现的历史在 NetworkX 2.0 时代pagerank算法存在多个实现pagerank纯 Python 实现pagerank_numpy面向稠密邻接矩阵pagerank_scipy面向稀疏邻接矩阵。在实际使用场景中SciPy 实现基于稀疏线性代数在绝大多数情况下性能远超其他实现。3.0 的变更3.0 中nx.pagerank默认调用 SciPy 实现。查看源码 networkx/algorithms/link_analysis/pagerank_alg.pypagerank函数L9的返回语句直接是return _pagerank_scipy( G, alpha, personalization, max_iter, tol, nstart, weight, dangling )而纯 Python 版本则保留为_pagerank_pythonL121不对外公开仅用于教学目的以引导用户使用高性能实现。升级要点调用nx.pagerank现在要求安装 SciPypagerank的参数保持一致alpha阻尼系数默认 0.85、personalization个性化向量、max_iter幂法最大迭代次数默认 100、tol收敛容差默认 1e-6、nstart迭代初值、weight边权重键默认weight、dangling悬空节点出边分配若未收敛会抛出PowerIterationFailedConvergence异常文档特别提示对大图要谨慎选择容差当len(G) * tol 2时幂迭代可能在一轮后就假收敛。核心变更三随机数接口支持numpy.random.GeneratorNumPy 1.17 引入了新一代伪随机数生成接口numpy.random.Generator。NetworkX 3.0 中networkx/utils/misc.py 的py_random_state与np_random_state装饰器以及底层的create_random_state见 misc.py已支持把Generator实例作为seed参数传入 G nx.barbell_graph(6, 2) pos nx.spring_layout(G, seednp.random.default_rng(123456789))Generator相比旧版RandomState的优势更好的统计特性与更高的性能。但需要注意两点Generator与RandomState流不兼容相同的种子产生的随机序列不同Generator不保证与未来 NumPy 版本的流兼容性。因此迁移指南给出了明确的选型建议需要跨 NetworkX 版本精确复现随机数过去与未来推荐使用RandomState rng np.random.RandomState(12345) pos nx.spring_layout(G, seedrng)新代码中不要求精确流复现推荐使用Generator rng np.random.default_rng(12345) pos nx.spring_layout(G, seedrng)注意Generator也能实现精确复现但可能要求安装特定版本的 NumPy。从create_random_state的源码misc.py可以看到其完整的接受类型None或np.random模块返回全局随机数生成器、np.random.RandomState实例原样返回、整数作为种子构造RandomState、np.random.Generator实例原样返回其他类型则抛出ValueError。核心变更四结构化 dtype 替代 recarray变更内容3.0 之前多属性邻接矩阵通过nx.to_numpy_recarray转换函数支持。numpy.recarray本质上是带结构化 dtype 的ndarray便捷包装。3.0 中to_numpy_recarray被移除结构化 dtype 支持加入to_numpy_array从而更通用地支持多属性邻接矩阵的数组表示。新写法示例迁移指南给出了完整的迁移示例——把每条边的weight与cost两个属性同时编码进一个结构化数组 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, dtypedtype, weightNone) 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, dtypedtype, weightNone).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.]])关键规则与源码 convert_matrix.py 的 docstring 一致使用结构化 dtype 时weight参数必须为None此时 dtype 的字段名被用来查找对应的边属性若dtype为结构化 dtype 且图是 multigraph抛出NetworkXError若weight非None抛出ValueError需要旧式 recarray 行为时可以用.view(np.recarray)恢复实现向后兼容的过渡。已移除的函数pickle 与 YAML 读写read_gpickle/write_gpickle这两个函数在 3.0 中被移除。NetworkX 图对象本身就是可 pickle 的 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直接序列化图对象 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, Loaderyaml.Loader)升级要点如果你的代码中出现了nx.read_gpickle、nx.write_gpickle、nx.read_yaml、nx.write_yaml的调用直接替换为上面的标准库写法即可对 networkx/readwrite 目录的检索也确认当前仓库中已不存在这四个函数的实现。快速迁移检查清单对照以下清单检查你的代码即可覆盖 3.0 的主要破坏性变更矩阵语义搜索代码中的numpy.matrix、scipy.sparse矩阵用法改为ndarray/ sparse array把*矩阵乘改为移除.I、.A、.H等矩阵专属调用。转换函数把to_numpy_matrix、to_scipy_sparse_matrix、to_numpy_recarray分别替换为to_numpy_array、to_scipy_sparse_array与结构化 dtype 写法见上文示例。pagerank确认环境已安装 SciPynx.pagerank现在默认走_pagerank_scipy纯 Python 版本不再公开。随机数seed参数可直接传np.random.default_rng(...)Generator或np.random.RandomState(...)需要跨版本精确复现时用RandomState。IO 函数read_gpickle/write_gpickle改用pickleread_yaml/write_yaml改用yaml。依赖核心功能零依赖使用networkx.linalg、pagerank 等线性代数相关功能前确认已安装numpy/scipy。如需进一步了解 3.0 的完整发布内容数据结构同步改进、G.adj改为缓存属性等可继续阅读 doc/release/release_3.0.rst上述源码证据均可在 networkx/convert_matrix.py、networkx/algorithms/link_analysis/pagerank_alg.py 与 networkx/utils/misc.py 中直接验证。【免费下载链接】networkxNetwork Analysis in Python项目地址: https://gitcode.com/gh_mirrors/ne/networkx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表