
NumPy 2.0.0 发布全解析从 NEP 50 标量提升到 StringDType 与 C-API 大改版的实战迁移指南【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpyNumPy 2.0.0 是该开源仓库 doc/changelog/2.0.0-changelog.rst 记录的里程碑式大版本由 212 位贡献者合入 1078 个 Pull Request涉及标量类型提升规则、Python/C 双 API 清理、可变宽字符串 dtype、构建系统迁移与大规模 SIMD 优化。本文以该发布日志为核心骨架结合仓库内的 NumPy 2.0 迁移指南 与numpy/_core、numpy/strings等源码模块系统梳理 2.0.0 的关键技术变更、背后设计动机以及下游代码的具体适配方法帮助你一次性掌握从 1.x 平稳升级到 2.x 所需的全部知识。版本全景一次蓄力多年的大版本发布从发布日志的统计信息看本次发布规模空前212 位贡献者参与其中带标记的为首次提交补丁的新贡献者如Algorithmist-Girl、ellaella12、matoro等约 90 余人1078 个 Pull Request被合并涵盖ENH功能增强、API接口变更、BUG缺陷修复、DEP弃用清理、BLD构建系统、DOC、TYP、CI、SIMD等多种类型。从 PR 主题可以清晰看到 2.0.0 的三大主线NEP 系列规范落地NEP 50 标量提升、NEP 51 标量表示、NEP 52 Python API 清理、NEP 55 可变宽字符串、NEP 56 Array API 主命名空间支持、构建基础设施全面切换#23838默认构建后端切换到 meson-python、#24519移除 setup.py、以及C-API 的大规模重构#23916C-ABI 升至版本 2、#25943重构 dtype 结构体。下文按主题逐项展开。NEP 50标量提升规则成为默认行为发布日志中#23912 API: Switch to NEP 50 behavior by default是本次发布影响面最大的 Python 层变更之一。NEP 50 改变了不同类型运算时结果 dtype 如何确定的规则核心是保留标量自身的精度不再被数组中元素类型拉低或抬升。迁移指南doc/source/numpy_2_0_migration_guide.rst给出了两个最典型的示例# 示例 1标量精度被保留1.x 中返回 float64 np.float32(3) 3. # 2.0 返回 float32 # 示例 2数组 高精度标量标量精度不被忽略 np.array([3], dtypenp.float32) np.float64(3) # 返回 float64 数组带来的直接后果是浮点场景下标量运算可能得到精度更低的结果整数场景下则可能出现溢出或报错。迁移指南给出的解决方案是显式转换使用int()、float()或numpy_scalar.item()确保使用 Python 标量或直接显式指定 dtype。为了在测试阶段追踪行为变化NumPy 2.0 提供了调试开关np._set_promotion_state(weak_and_warn) # 对行为改变发出警告配合warnings.simplefilter可将警告升级为异常以获取回溯。需要注意的是该开关可能标记大量实际无关紧要的变化仅建议在测试期使用。仓库中numpy/_core/umath.py等模块的类型推断与 ufunc 实现均已按 NEP 50 语义调整。NEP 52Python API 清理与命名空间重构发布日志中#23537提出 NEP 52、#23830、#24144、#24316、#24357、#24376、#24445、#24587等一系列 Cleaningnumpy/__init__.pyand main namespace - Part 1~5 的 PR构成 2.0.0 的瘦身工程。迁移指南给出了完整的迁移对照表以下是最常用的几类主命名空间移除成员节选被移除成员迁移建议alltrue/sometrue改用np.all/np.anycumproduct/product改用np.cumprod/np.prodcfloat/clongfloat/singlecomplex/longcomplex改用np.complex128/np.clongdouble/np.complex64/np.clongdoublecast改用np.asarray(arr, dtypedtype)find_common_type改用np.promote_types或np.result_typeseterrobj/geterrobj使用np.errstate上下文管理器Inf/Infinity/PINF/NINF/NaN改用np.inf/-np.inf/np.nanrecfromcsv/recfromtxt改用np.genfromtxtlookfor/source/who分别改用官方文档搜索、inspect.getsource、IDE 变量浏览器本次仅弃用、后续版本再移除的成员in1d改用np.isin、row_stack改用np.vstack、trapz改用np.trapezoid该新名称由#25738引入。np.lib命名空间大幅收缩#24513、#24536~#24581等一系列 Updatelib.*namespace PR 后np.lib只保留少量专门子模块array_utils、format、introspect、mixins、npyio、scimath、stride_tricks、Arrayterator与NumpyVersion类、add_docstring/add_newdoc函数以及tracemalloc_domain常量。仓库当前目录结构 numpy/lib 与此完全对应。np.core→np._core私有化#24634 API: Rename numpy/core to numpy/_core [NEP 52]将核心模块改为私有命名。当前仓库中 numpy/core 与 numpy/_core 并存前者为兼容薄层迁移指南明确用户不应直接从_core取成员而应使用主命名空间_core内部布局可能随时变化不享受公共模块的弃用期保证。ndarray/标量方法到期移除newbyteorder改用arr.view(arr.dtype.newbyteorder(order))、ptp改用np.ptp(arr, ...)、itemset改用arr[index] value对应 PR#24682 API: Remove ptp, itemset and newbyteorder。同时#24494移除了np.msort。NEP 55 与字符串处理StringDType 与 np.strings 命名空间2.0.0 引入了可变宽字符串 dtype#25347 API: Introduce stringdtype [NEP 55]结束了几十年来只能使用固定宽度S/U字符串的历史。围绕它有一大批 PR#24858add ufunc 支持 unicode/bytes、#24868find/rfind、#24947startswith/endswith、#24951isdigit/isspace/isdecimal/isnumeric、#25104str_len/count、#25152strip/lstrip/rstrip、#25171replace、#25775index/rindex、#25791其余一元 ufunc、#25864multiply、#25891expandtabs等把字符串操作全部重写为ufunc 实现。发布日志同时显示新的np.strings命名空间由#25463 ENH: Add np.strings namespace引入#25636 MAINT: Move np.char methods to np.strings将np.char的方法迁入。仓库中 numpy/strings 目录即该命名空间的载体而 numpy/_core/defchararray.pyi 中的类型标注显示旧的np.char方法现以np.dtypes.StringDType为输入类型如multiply、mod、capitalize、join等。迁移指南建议优先使用np.strings函数np.char仍然可用且尽可能复用新 ufunc 以提升性能但未来可能弃用。此外 NEP 55 的详细设计与内存布局短字符串内联、arena/堆分配可查阅 doc/neps/nep-0055-string_dtype.rst。默认整数类型Windows 上 64 位化#24224 API: Make 64bit default integer on 64bit windows终结了 Windows 上np.int_即 Clong为 32 位的遗留行为。迁移指南指出默认整数现在在所有 64 位系统上都等于np.intp对多数终端用户影响很小部分操作更占内存、部分反而更快但对接编译语言库的开发者需要注意 C 侧long的位宽建议在 C/Cython 侧改用intp或在 C 中创建新整数数组时使用新增的NPY_DEFAULT_INT宏——该宏在 NumPy 1.x 下展开为NPY_LONG、在 2.0 下为NPY_INTP由兼容头文件提供。构建系统全面切换到 Meson发布日志中#23838 BLD: switch to meson-python as the default build backend、#24519 MAINT: remove setup.py、#24532 ENH: meson backend for f2py、#24573 DOC: Update building docs to use Meson标志着构建基础设施的换代。配套改动包括CPU 分发器#23096 BLD, SIMD: The meson CPU dispatcher implementation当前仓库 meson_cpu 下保留 x86/arm/ppc64/riscv64/s390x/loongarch64 各架构的 SIMD 目标配置BLAS/LAPACK 自动检测#24893 ENH: meson: implement BLAS/LAPACK auto-detection、#23984改进 CBLAS 处理并新增-Duse-ilp64构建选项、#25063将allow-noblas选项默认改为trueBLAS 后端多样化#24053采用新版 macOS Accelerate 接口#25255在 macOS ≥ 14 上新增基于 Accelerate 的 wheel 构建、#24839改用 scipy-openblas wheelpkg-config 支持#25730 ENH: add a pkg-config file and a numpy-config script仓库 numpy/_core/numpy.pc.in 即该模板。此外#23825/#24236将 Cython 升级到 3.x、#25072默认采用 C11 标准、#24967在 macOS 上使用经典链接器规避 Xcode 15 问题、#26540实现可复现构建。性能与 SIMD从 x86 到 AArch64 的全面向量化发布日志中的 SIMD 相关 PR 数量可观代表工作包括#23351为 float16 umath 启用 AVX512-FP16 SVML 内容#24006为双精度 umath 使用高精度 SVML#24201使用 AVX-512 向量化np.partition/np.argpartition#24505应为 #25045向量化np.sort/np.partitionAVX2#25610向量化argsort/argselectAVX2#24018 ENH: Use Highways VQSort on AArch64引入 Google Highway 向量排序库#25247启用 SVE 检测、#25346支持 16 位 VQSort、#25563扩展 Highway quicksort 的启用目标、#25873升级到 Highway 1.1.0#25416为vecdot定义带 BLAS 支持的 gufunc#24126为std/var新增mean关键字#25788提升np.tensordot性能。值得注意的还有#23898 API: Change string to bool conversions、#25712 API: Make any and all return booleans by default等行为收敛以及#24018、#25299、#24663等纯性能优化array_equal、polyutils.as_series。C-API 变更ABI 版本 2 与 dtype 结构体重构发布日志明确#23916 ABI: Bump C-ABI to 2——这是对扩展开发者影响最深的部分迁移指南专设 C-API Changes 章节PyArray_Descr 结构体变得半不透明#25943 API: Restructure the dtype struct将PyArray_Descr的字段改为通过访问器函数获取为未来 itemsize 突破int限制、改进结构化 dtype 留出空间。代码中arr-descr-elsize应替换为PyArray_ITEMSIZE(arr)必须直接访问时使用新访问器PyDataType_ELSIZE/PyDataType_SET_ELSIZE返回值类型从int变为npy_intpPyDataType_ALIGNMENT、PyDataType_FIELDS、PyDataType_NAMES、PyDataType_SUBARRAY、PyDataType_C_METADATAPyDataType_FLAGS#25816、PyDataType_GetArrFuncs#25812后经#25862回退再经#25897落实自定义 dtype 现在必须通过PyArray_DescrProto注册#25792。兼容 1.x 与 2.x 的写法参考迁移指南中的宏定义模式#if NPY_ABI_VERSION 0x02000000 #define PyDataType_ELSIZE(descr) ((descr)-elsize) #endifnpy_2_compat.h 兼容头文件#25057 MAINT: Add npy_2_compat.h新增的兼容头文件位于仓库 numpy/_core/include/numpy/npy_2_compat.h可将其中定义如NPY_DEFAULT_INT、NPY_RAVEL_AXIS整体或部分 vendoring 进自己的代码库从而在编译 1.x 时也能使用新 API。配合PyArray_RUNTIME_VERSION NPY_2_0_API_VERSION可以做显式的版本分支#25866还补充了新的 import 辅助函数PyArray_ImportNumPyAPI()轻量、可重复调用。维度上限与轴标记#25149 API: bump MAXDIMS/MAXARGS to 64将NPY_MAXDIMS/NPY_MAXARGS提升至 64同时NPY_MAXDIMS不再作为axisNone的哨兵值——C API 中应改用NPY_RAVEL_AXIS1.x 下映射为 322.x 下映射为-2147483648否则会触发AxisError。复数类型的底层 C 类型变更#24085 ENH: Replace npy complex structs with native complex types将全部复数类型的底层 C 类型改为原生 C99 复数。内存布局不变但c.real/c.imag直接字段访问不再可用应改用npy_creal/npy_cimag以及 float/long double 变体设置操作使用新增的npy_csetreal/npy_csetimag与宏NPY_CSETREAL/NPY_CSETIMAG。Cython 用户应使用原生 typedefcfloat_t/cdouble_t/clongdouble_t且 C 模式下c.imag 1这类原地运算符不再可用。迁移指南还提醒2.0 包含complex.h代码若用户代码以I作为变量名需先#undef I。其他 C-API 清理#23922移除seterrobj/geterrobj/extobj#23919移除中断处理与noprefix.h#24011移除old_defines.h#24258移除PyArray复数宏#25156移除PyArray_REFCNT/NPY_REFCOUNT#25292 API: C-API removals批量清理#25754 API: Expose the dtype C API与#25954 API: Expose PyArray_Pack则补充了新公开接口。Python 层行为调整copy 关键字与 pickle 兼容#23789np.reshape增加copy参数、#25168np.asarray引入copy参数、#25922修复__array__对 copy 关键字的处理共同定义了 2.0 的copy语义np.array(..., copyFalse)的旧用法应改为np.asarray(...)自定义对象的__array__方法应补充dtypeNone, copyNone签名copyTrue恒返回新副本copyNone按需复制copyFalse绝不复制、必要时抛出ValueError#26652禁止在copy关键字上传入字符串。Pickle 兼容性迁移指南2.0 与 1.26 可互相加载对方的 pickle 文件1.25 及更早版本加载 2.0 生成的 pickle 会抛异常。#25866引入NumpyUnpickler#24866 API: Add NumpyUnpickler#26458将np.save默认 pickle 协议提升为协议 4。面向 Array API 标准的新增函数发布日志显示 2.0.0 同步推进 Array API 标准v2022.12#23881在主命名空间的落地新增了大量规范函数与参数np.linalg扩展diagonal/trace#24887、svdvals#24940、outer#25101、cross#25145、matrix_norm/vector_norm/vecdot/matrix_transpose#25155、matrix_rank的rtol/stable参数#25437主命名空间np.isdtype#25054、np.astype#25079、np.bool#25080、np.long/np.ulong#24922#24888同时让intp等于ssize_t并引入nN字符码、std/var的correction参数#25169、ndarray.device/to_device#25233、any/all默认返回布尔#25712#25911 MAINT: remove numpy.array_api module移除了实验性的numpy.array_api子模块其能力并入主命名空间#25167添加ndarray.__array_namespace__以支持 Array API 测试套件。#25570将多个*split函数的返回类型统一为 tupleNumba 兼容后经#25800部分回退#25553修复unique_inverse的inverse_indices返回形状。其他值得关注的变更速览测试与调试工具assert_allclose/assert_equal/assert_array_less新增strict参数#24680/#24770/#24775err_msg支持可调用对象#24877spin开发命令集扩充gdb/benchmark/lint/changelog/notes/lldb#24083/#24107/#24983/#24986/#25017/#25232新 ufuncbitwise_count#21429可在 numpy/_core/umath.py 的函数清单中查到新属性ndarray.mT矩阵转置属性#23762日期时间#21199暴露 datetime C 函数给 Cython#24193移除datetime64构造时的过时弃用警告io#25158将loadtxt的encoding默认值改为None#24142允许 NEP 42 dtype 使用np.save/np.load多项式#24745修改多项式包默认值#25434将尾部逗号元组视为结构化 dtype打包#24235只安装f2py命令不再有f2py3/f2py3.X#26173将numpy.version正式公开。升级实操建议如何安全跨越 2.0综合迁移指南的结论给出四条可执行的升级路径启用 Ruff 的 NPY201 规则自动改码在pyproject.toml中加入select [NPY201]需ruff0.4.8或命令行执行ruff check path/to/code/ --select NPY201大部分命名空间与行为变更可被自动检测甚至自动修复测试期开启提升警告调用np._set_promotion_state(weak_and_warn)定位 NEP 50 相关的行为差异配合warnings.simplefilter(error)获取回溯扩展库与 C-API 用户先读 ABI 章节确认是否依赖PyArray_Descr直接字段、long位宽假设、复数结构体布局必要时 vendoring npy_2_compat.h 并显式引入import_array()版本分支代码需要使用numpy.lib.NumpyVersion时按迁移指南的推荐模式编写如 2.0 中AxisError从主命名空间移入numpy.exceptionsif np.lib.NumpyVersion(np.__version__) 2.0.0b1: from numpy.exceptions import AxisError else: from numpy import AxisError这个模式对 RC 版本同样有效正好覆盖 2.0.0 发布周期日志末尾#25977、#25987、#25997、#26425记录了一连串 beta/RC 准备工作#26540则保证构建可复现。小结NumPy 2.0.0 不是一次普通的主版本迭代而是对 Python 与 C 双层 API、dtype 架构、构建系统和 SIMD 后端的系统性重塑NEP 50 让类型提升规则回归直觉NEP 52 让命名空间恢复整洁NEP 55 让字符串 dtype 走向现代meson 迁移让构建链更可维护而 C-ABI 2 的引入则为未来 dtype 演进铺平道路。对普通用户主要影响集中在标量提升、命名空间移动与字符串 API对扩展与二进制库开发者则务必对照迁移指南的 C-API 章节逐项核查。本文所引全部内容均可回溯到仓库内的发布日志、迁移指南与源码模块建议在动手升级前通读 doc/source/numpy_2_0_migration_guide.rst 全文以获得最权威的逐项迁移对照。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考