NumPy 2.0.0 发行说明#
NumPy 2.0.0 是自 2006 年以来的第一个主要版本.它是自上次功能发布以来 11 个月开发的成果,是 212 位贡献者在 1078 个 pull request 中共同努力的结果.它包含大量令人兴奋的新功能,以及对 Python 和 C API 的更改.
此主要版本包括重大更改,这些更改无法在常规次要(功能)版本中进行 - 包括 ABI 中断,类型提升规则的更改以及 API 更改,这些更改可能未在 1.26.x 中发出弃用警告. 除了这些发行说明之外,与如何适应 NumPy 2.0 中的更改相关的关键文档包括:
亮点#
此版本亮点包括:
新功能:
一种新的可变长度字符串 dtype,
StringDType和一个新的numpy.strings命名空间,其中包含用于字符串操作的高性能 ufuncs,支持所有
numpy.fft函数中的float32和longdouble,支持主
numpy命名空间中的数组 API 标准.
性能提升:
排序函数(
sort,argsort,partition,argpartition)已通过使用 Intel x86-simd-sort 和 Google Highway 库加速,并且可能会看到很大的(硬件特定的)速度提升,macOS Accelerate 支持和适用于 macOS >=14 的二进制 wheel,在 macOS 上对线性代数运算进行显着性能改进,并且 wheel 的大小约为原来的 1/3,
numpy.char固定长度字符串操作已通过实现 ufunc 加速,这些 ufunc 除了支持固定长度字符串 dtype 外,还支持StringDType,一个新的跟踪和内省 API,
opt_func_info,用于确定哪些硬件特定的内核可用,以及将调度到哪些内核.numpy.save现在使用 pickle 协议版本 4 来保存具有 object dtype 的数组,这允许 pickle 对象大于 4GB,并将大型数组的保存速度提高约 5%.
Python API 改进:
公共 API 和私有 API 之间有明确的划分,具有一个新的 module structure ,并且每个公共函数现在都可以在一个地方获得,
许多已弃用的函数和别名已被删除.这应该使学习和使用 NumPy 更加容易.主命名空间中的对象数量减少了约 10%,
numpy.lib中的对象数量减少了约 80%,Canonical dtype names 和一个新的
isdtype内省函数,
C API 改进:
许多过时的函数和宏已被删除,并且私有内部结构已隐藏,以方便将来的可扩展性,
新的,更易于使用的初始化函数
PyArray_ImportNumPyAPI和PyUFunc_ImportUFuncAPI.
改进的行为:
通过采用 NEP 50 ,类型提升行为得到了改进.这修复了许多关于提升的用户意外,这些提升以前通常取决于输入数组的数据值,而不仅仅是它们的 dtype.有关详细信息,请参阅 NEP 和 NumPy 2.0 迁移指南 ,因为此更改可能导致输出 dtype 的更改以及混合 dtype 操作的较低精度结果.
Windows 上的默认整数类型现在是
int64而不是int32,与其他平台上的行为相匹配,数组维度的最大数量从 32 更改为 64
文档:
参考指南导航已得到显着改进,并且现在有关于 NumPy 的 module structure 的文档,
building from source 文档已完全重写,
此外, NumPy 内部结构进行了许多更改,包括继续将代码从 C 迁移到 C++,这将使其更容易在将来改进和维护 NumPy.
“没有免费的午餐”定理决定了为所有这些 API 和行为改进以及更好的未来可扩展性付出代价.这个代价是:
向后兼容性.Python 和 C API 都有大量的重大更改.在大多数情况下,都有明确的错误消息,会告知用户如何调整其代码.但是,行为也发生了一些变化,对于这些变化,无法给出这样的错误消息 - 这些情况都包含在下面的“弃用和兼容性”部分以及 NumPy 2.0 迁移指南 中.
请注意,可以使用
ruff模式来自动修复 Python 代码中的许多问题.NumPy ABI 的重大更改.因此,使用 NumPy C API 并针对 NumPy 1.xx 版本构建的软件包的二进制文件将无法与 NumPy 2.0 一起使用.导入时,此类软件包将看到
ImportError,其中包含有关二进制不兼容的消息.可以构建针对 NumPy 2.0 的二进制文件,这些文件可以在运行时与 NumPy 2.0 和 1.x 一起使用.有关更多详细信息,请参见 NumPy 2.0 特定的建议 .
建议所有依赖于 NumPy ABI 的下游软件包都发布一个针对 NumPy 2.0 构建的新版本,并验证该版本是否适用于 2.0 和 1.26,理想情况下,应该在 2.0.0rc1(ABI 将稳定)和最终的 2.0.0 版本之间进行,以避免给用户带来问题.
此版本支持的 Python 版本为 3.9-3.12.
NumPy 2.0 Python API 删除#
np.geterrobj,np.seterrobj和相关的 ufunc 关键字参数extobj=已被删除.所有这些的首选替代方法是使用上下文管理器with np.errstate():.( gh-23922 )
np.cast已被删除.np.cast[dtype](arg)的字面替代是np.asarray(arg, dtype=dtype).np.source已被删除.首选的替代方法是inspect.getsource.np.lookfor已被删除.( gh-24144 )
numpy.who已被删除.作为已删除功能的替代方法,可以使用 IDE(如 Spyder 或 Jupyter Notebook)中提供的变量资源管理器.( gh-24321 )
numpy.exceptions中存在的警告和异常(例如,ComplexWarning,VisibleDeprecationWarning)不再在主命名空间中公开.已从主命名空间中删除多个小众枚举,过期的成员和函数,例如:
ERR_*,SHIFT_*,np.fastCopyAndTranspose,np.kernel_version,np.numarray,np.oldnumeric和np.set_numeric_ops.( gh-24316 )
使用显式导入替换
numpy/__init__.py中的from ... import *.因此,这些主命名空间成员被删除:np.FLOATING_POINT_SUPPORT,np.FPE_*,np.NINF,np.PINF,np.NZERO,np.PZERO,np.CLIP,np.WRAP,np.WRAP,np.RAISE,np.BUFSIZE,np.UFUNC_BUFSIZE_DEFAULT,np.UFUNC_PYVALS_NAME,np.ALLOW_THREADS,np.MAXDIMS,np.MAY_SHARE_EXACT,np.MAY_SHARE_BOUNDS,add_newdoc,np.add_docstring和np.add_newdoc_ufunc.( gh-24357 )
别名
np.float_已被删除.请改用np.float64.别名
np.complex_已被删除.请改用np.complex128.别名
np.longfloat已被删除.请改用np.longdouble.别名
np.singlecomplex已被删除.请改用np.complex64.别名
np.cfloat已被删除.请改用np.complex128.别名
np.longcomplex已被删除.请改用np.clongdouble.别名
np.clongfloat已被删除.请改用np.clongdouble.别名
np.string_已被删除.请改用np.bytes_.别名
np.unicode_已被删除.请改用np.str_.别名
np.Inf已被移除.请使用np.inf代替.别名
np.Infinity已被移除.请使用np.inf代替.别名
np.NaN已被移除.请使用np.nan代替.别名
np.infty已被移除.请使用np.inf代替.别名
np.mat已被移除.请使用np.asmatrix代替.np.issubclass_已被移除.请使用内置的issubclass代替.np.asfarray已被移除.请使用带有适当 dtype 的np.asarray代替.np.set_string_function已被移除.请使用np.set_printoptions代替,并使用格式化程序自定义打印 NumPy 对象.np.tracemalloc_domain现在只能从np.lib中获取.np.recfromcsv和np.recfromtxt已从主命名空间中移除.请使用带逗号分隔符的np.genfromtxt代替.np.issctype,np.maximum_sctype,np.obj2sctype,np.sctype2char,np.sctypes,np.issubsctype都已从主命名空间中移除,且没有替代品,因为它们是利基成员.已弃用的
np.deprecate和np.deprecate_with_doc已从主命名空间中移除.请使用DeprecationWarning代替.已弃用的
np.safe_eval已从主命名空间中移除.请使用ast.literal_eval代替.( gh-24376 )
np.find_common_type已被移除.请使用numpy.promote_types或numpy.result_type代替.要实现scalar_types参数的语义,请使用numpy.result_type并传递0,0.0或0j作为 Python 标量.np.round_已被移除.请使用np.round代替.np.nbytes已被移除.请使用np.dtype(<dtype>).itemsize代替.( gh-24477 )
np.compare_chararrays已从主命名空间中移除.请使用np.char.compare_chararrays代替.主命名空间中的
charrarray已被弃用.现在可以从np.char.chararray导入它,而不会出现弃用警告,但我们计划将来完全弃用并移除chararray.np.format_parser已从主命名空间中移除.请使用np.rec.format_parser代替.( gh-24587 )
对七种数据类型字符串别名的支持已从
np.dtype中移除:int0,uint0,void0,object0,str0,bytes0和bool8.( gh-24807 )
实验性的
numpy.array_api子模块已被移除.对于常规用法,请使用主要的numpy命名空间,或者对于numpy.array_api主要用于的合规性测试用例,请使用单独的array-api-strict包.( gh-25911 )
__array_prepare__ 已移除#
在为常规 ufunc 调用(不是广义 ufunc,归约等)运行计算之前,UFuncs 调用 __array_prepare__ .该函数还在某些线性代数函数的结果上被调用来代替 __array_wrap__ .
它现在已被删除.如果您使用它,请迁移到 __array_ufunc__ 或依赖于 __array_wrap__ ,它在所有情况下都会使用上下文调用,尽管仅在结果数组被填充后.在这些代码路径中, __array_wrap__ 现在将传递一个基类,而不是一个子类数组.
( gh-25105 )
弃用#
由于不再支持 Python 2,因此
np.compat已被弃用.numpy.int8和类似的类将不再支持将超出范围的 Python 整数转换为整数数组.例如,将 255 转换为 int8 将不会返回 -1.numpy.iinfo(dtype)可用于检查数据类型的机器限制.例如,np.iinfo(np.uint16)返回 min = 0 和 max = 65535.np.array(value).astype(dtype)将给出想要的结果.np.safe_eval已被弃用.应该使用ast.literal_eval代替.( gh-23830 )
np.recfromcsv,np.recfromtxt,np.disp,np.get_array_wrap,np.maximum_sctype,np.deprecate和np.deprecate_with_doc已被弃用.( gh-24154 )
np.trapz已被弃用.请改用np.trapezoid或scipy.integrate函数.np.in1d已被弃用.请改用np.isin.别名
np.row_stack已被弃用.请直接使用np.vstack.( gh-24445 )
__array_wrap__现在传递arr, context, return_scalar,并且对不接受所有三个的实现的支持已被弃用.它的签名应该是__array_wrap__(self, arr, context=None, return_scalar=False)( gh-25409 )
用于
np.cross的二维向量数组已被弃用.请改用三维向量数组.( gh-24818 )
np.dtype("a")别名np.dtype(np.bytes_)已被弃用.请改用np.dtype("S")别名.( gh-24854 )
带有函数
assert_array_equal和assert_array_almost_equal的关键字参数x和y的使用已被弃用.请将前两个参数作为位置参数传递.( gh-24978 )
numpy.fft 弃用 n 维变换中参数的 None 值#
根据array API标准,将 s 参数设置为非 None 值并将 axes 参数设置为 None 来使用 fftn , ifftn , rfftn , irfftn , fft2 , ifft2 , rfft2 或 irfft2 已被弃用.为了保留当前行为,对于维度为k的数组,请将序列 [0, …, k-1] 传递给 axes .
此外,将包含 None 值的数组传递给 s 已被弃用,因为该参数在NumPy文档和array API规范中都被记录为接受整数序列.要使用相应的一维变换的default行为,请传递与其 n 参数的default值匹配的值. 要使用每个轴的default行为,可以省略 s 参数.
( gh-25495 )
np.linalg.lstsq 现在默认为新的 rcond 值#
lstsq 现在使用机器精度乘以 max(M, N) 的新 rcond 值. 以前,使用机器精度,但给出了 FutureWarning 以通知此更改最终会发生. 通过传递 rcond=-1 仍然可以实现旧的行为.
( gh-25721 )
已过期的弃用#
np.core.umath_tests子模块已从公共 API 中移除.(在 NumPy 1.15 中已弃用)( gh-23809 )
PyDataMem_SetEventHook的弃用已到期并已移除.使用tracemalloc和np.lib.tracemalloc_domain域.(在 NumPy 1.23 中已弃用)( gh-23921 )
set_numeric_ops以及 C 函数PyArray_SetNumericOps和PyArray_GetNumericOps的弃用已到期,这些函数已被移除.(在 NumPy 1.16 中已弃用)( gh-23998 )
fasttake,fastclip和fastputmaskArrFuncs的弃用现已完成.已弃用的函数
fastCopyAndTranspose及其 C 语言对应物现已移除.PyArray_ScalarFromObject的弃用现已完成.( gh-24312 )
np.msort已被移除.作为替代,应使用np.sort(a, axis=0).( gh-24494 )
np.dtype(("f8", 1)现在将返回形状为 1 的子数组 dtype,而不是非子数组 dtype.( gh-25761 )
不允许分配给 ndarray 的
.data属性,否则将引发异常.如果 width 太小,
np.binary_repr(a, width)将引发异常.在
PyArray_DescrFromType()中使用NPY_CHAR将引发异常,请改用NPY_STRING,NPY_UNICODE或NPY_VSTRING.( gh-25794 )
兼容性说明#
loadtxt 和 genfromtxt 默认编码已更改#
loadtxt 和 genfromtxt 现在都默认为 encoding=None ,这可能会主要修改 converters 的工作方式.现在这些将被传递 str 而不是 bytes .显式传递编码以始终获得新的或旧的行为.对于 genfromtxt ,此更改还意味着返回值现在将是 unicode 字符串而不是字节.
( gh-25158 )
f2py 兼容性说明#
f2py将不再接受不明确的-m和.pyfCLI 组合.当传递多个.pyf文件时,会引发错误. 当同时传递-m和.pyf时,会发出警告,并且-m提供的名称将被忽略.( gh-25181 )
f2py.compile()辅助函数已被移除,因为它会泄漏内存,并且已经被标记为实验性多年,并且被实现为一个简单的subprocess.run包装器. 它也是测试瓶颈之一. 有关完整的原因,请参见 gh-25122 . 它还使用了几个np.distutils功能,这些功能过于脆弱,无法移植到与meson一起使用.强烈建议用户使用调用
subprocess.run("python", "-m", "numpy.f2py",...来替换对f2py.compile的调用,并使用环境变量与meson交互. Native files 也是一个选项.( gh-25193 )
排序函数行为的细微变化#
由于算法更改和 SIMD 代码的使用,与 1.26.x 相比,2.0.0 中使用非稳定方法的排序函数可能会返回略有不同的结果. 这包括 argsort 和 argpartition 的默认方法.
移除 np.solve 中广播机制的歧义#
当 b 的维度比 a 少 1 时, np.solve(a, b) 的广播规则存在歧义.这个问题已经通过一种向后不兼容的方式解决,现在符合 Array API.旧的行为可以通过使用 np.solve(a, b[..., None])[..., 0] 来重建.
( gh-25914 )
修改了 Polynomial 的表示#
Polynomial 的表示方法已更新,以在表示中包含域.纯文本和 latex 表示现在一致.例如, str(np.polynomial.Polynomial([1, 1], domain=[.1, .2])) 的输出曾经是 1.0 + 1.0 x ,但现在是 1.0 + 1.0 (-3.0000000000000004 + 20.0 x) .
( gh-21760 )
C API 更改#
PyArray_CGT,PyArray_CLT,PyArray_CGE,PyArray_CLE,PyArray_CEQ,PyArray_CNE宏已被移除.PyArray_MIN和PyArray_MAX已从ndarraytypes.h移动到npy_math.h.( gh-24258 )
公开了一个用于处理
numpy.dtypes.StringDType数组的 C API.这包括用于获取和释放互斥锁的函数,这些互斥锁锁定对字符串数据的访问,以及从数组条目中打包和解包 UTF-8 字节流.NPY_NTYPES已重命名为NPY_NTYPES_LEGACY,因为它不包含新的 NumPy 内置 DType.特别是,新的字符串 DType 可能无法与处理旧 DType 的代码一起正常工作.( gh-25347 )
C-API 现在仅导出数组访问器的静态内联函数版本(以前这取决于使用“deprecated API”).虽然我们不鼓励这样做,但结构字段仍然可以直接使用.
( gh-25789 )
NumPy 现在定义了
PyArray_Pack来设置单个内存地址.与PyArray_SETITEM不同,此函数等效于设置单个数组项,并且不需要 NumPy 数组输入.( gh-25954 )
->f槽已从PyArray_Descr中移除.如果使用此槽,请使用PyDataType_GetArrFuncs替换对其的访问(请参阅其文档和 NumPy 2.0 迁移指南 ).在某些情况下,使用其他函数(如PyArray_GETITEM)可能是一种替代方法.PyArray_GETITEM和PyArray_SETITEM现在需要导入 NumPy API 表才能使用,并且不再在ndarraytypes.h中定义.( gh-25812 )
由于运行时依赖关系,访问 dtype 标志的功能的定义已从
numpy/ndarraytypes.h移动,并且只有在包含numpy/ndarrayobject.h后才能使用,因为它需要import_array().这包括PyDataType_FLAGCHK,PyDataType_REFCHK和NPY_BEGIN_THREADS_DESCR.PyArray_Descr上的 dtype 标志现在必须通过PyDataType_FLAGS内联函数访问,以便与 1.x 和 2.x 兼容.此函数在npy_2_compat.h中定义,以允许反向移植.大多数或所有用户应使用PyDataType_FLAGCHK,它在 1.x 上可用,并且不需要反向移植.Cython 用户应使用 Cython 3.否则,除非他们使用PyDataType_FLAGCHK,否则访问将通过 Python.( gh-25816 )
C API 和 Cython 绑定中公开的 Datetime 功能#
函数 NpyDatetime_ConvertDatetime64ToDatetimeStruct , NpyDatetime_ConvertDatetimeStructToDatetime64 , NpyDatetime_ConvertPyDateTimeToDatetimeStruct , NpyDatetime_GetDatetimeISO8601StrLen , NpyDatetime_MakeISO8601Datetime 和 NpyDatetime_ParseISO8601Datetime 已添加到 C API,以方便在外部库中字符串,Python datetimes 和 NumPy datetimes 之间进行转换.
( gh-21199 )
广义 ufunc C API 的常量正确性#
NumPy C API 中用于构造广义 ufuncs 的函数( PyUFunc_FromFuncAndData , PyUFunc_FromFuncAndDataAndSignature , PyUFunc_FromFuncAndDataAndSignatureAndIdentity )接受 types 和 data 参数,这些参数不会被 NumPy 内部修改. 与 name 和 doc 参数一样,第三方 Python 扩展模块可能会从静态常量提供这些参数. 现在 types 和 data 参数是常量正确的:它们分别声明为 const char types 和 void const data . C 代码应该不会受到影响,但 C++ 代码可能会受到影响.
( gh-23847 )
更大的 NPY_MAXDIMS 和 NPY_MAXARGS ,引入了 NPY_RAVEL_AXIS#
NPY_MAXDIMS 现在是 64,您可能需要检查它的使用情况. 这通常用在堆栈分配中,增加应该是安全的. 但是,我们通常鼓励删除任何对 NPY_MAXDIMS 和 NPY_MAXARGS 的使用,以便最终完全删除该约束. 对于转换助手和镜像 Python 函数的 C-API 函数,例如 take , NPY_MAXDIMS 过去表示 axis=None . 这种用法必须替换为 NPY_RAVEL_AXIS . 另请参见 增加最大维度数 .
( gh-25149 )
NPY_MAXARGS 不是常量,并且 PyArrayMultiIterObject 大小发生变化#
由于 NPY_MAXARGS 增加了,它现在是一个运行时常量,而不是编译时常量. 我们预计几乎没有用户会注意到这一点. 但是,如果用于堆栈分配,则现在必须替换为使用 NPY_MAXARGS 作为附加运行时检查的自定义常量.
sizeof(PyArrayMultiIterObject) 不再包含对象的完整大小. 我们预计没有人会注意到此更改. 这是避免 Cython 出现问题的必要措施.
( gh-25271 )
自定义旧版用户 dtypes 所需的更改#
为了改进我们的 DType,不幸的是必须破坏 ABI,这需要对使用 PyArray_RegisterDataType 注册的 dtypes 进行一些更改. 请参阅 PyArray_RegisterDataType 的文档,了解如何调整代码并实现与 1.x 和 2.x 的兼容性.
( gh-25792 )
新的公共 DType API#
NEP 42 DType API 的 C 实现现已公开. 虽然 DType API 已经在 NumPy 中发布了几个版本,但只有在设置了特殊环境变量的会话中才能使用. 现在可以使用新的 DType API 和用于导入 numpy C API 的普通 import_array() 机制在 NumPy 之外编写自定义 DType.
有关 API 的更多详细信息,请参见 自定义数据类型 . 与新功能一样,请报告您在实现或使用新 DType 时遇到的任何错误. 使用 dtypes 的下游 C 代码可能需要更新才能与新 DType 正确工作.
( gh-25754 )
新的 C-API 导入函数#
现在,我们添加了 PyArray_ImportNumPyAPI 和 PyUFunc_ImportUFuncAPI 作为静态内联函数来导入 NumPy C-API 表. 与 import_array 和 import_ufunc 相比,新函数具有两个优点:
它们会检查是否已执行导入,如果未执行,则它们是轻量级的,允许明智地添加它们(尽管在大多数情况下这不是首选).
旧机制是宏,而不是包含
return语句的函数.
PyArray_ImportNumPyAPI() 函数包含在 npy_2_compat.h 中,以便更轻松地进行反向移植.
( gh-25866 )
通过函数访问结构化的 dtype 信息#
dtype 结构的字段 c_metadata , names , fields 和 subarray 现在必须通过遵循相同名称的新函数来访问,例如 PyDataType_NAMES . 直接访问字段无效,因为它们并非对所有 PyArray_Descr 实例都存在. 保留 metadata 字段,但宏版本也应是首选.
( gh-25802 )
描述符 elsize 和 alignment 访问#
除非仅使用 NumPy 2 支持进行编译,否则现在必须通过 PyDataType_ELSIZE , PyDataType_SET_ELSIZE 和 PyDataType_ALIGNMENT 访问 elsize 和 alignment 字段. 如果描述符附加到数组,我们建议使用 PyArray_ITEMSIZE ,因为它存在于所有 NumPy 版本上. 有关更多信息,请参见 PyArray_Descr 结构体已被更改 .
( gh-25943 )
NumPy 2.0 C API 删除#
npy_interrupt.h和相应的宏(如NPY_SIGINT_ON)已被删除. 我们建议定期查询PyErr_CheckSignals()或PyOS_InterruptOccurred()(但这些目前确实需要持有 GIL).noprefix.h标头已被删除. 将缺少的符号替换为其带有前缀的对应项(通常是添加的NPY_或npy_).( gh-23919 )
PyUFunc_GetPyVals,PyUFunc_handlefperr和PyUFunc_checkfperr已被删除. 如果需要,可以恢复一个新的向后兼容函数以引发浮点错误. 删除的原因:没有已知的用户,并且这些函数会使with np.errstate()的修复变得更加困难).( gh-23922 )
自 NumPy 1.7 以来已被弃用的 API 的一部分
numpy/old_defines.h已被删除. 这将删除PyArray_CONSTANT形式的宏. replace_old_macros.sed 脚本可用于将它们转换为NPY_CONSTANT版本.( gh-24011 )
删除了 ufunc 结构的
legacy_inner_loop_selector成员,以简化对调度系统的改进. 没有已知的用户覆盖或直接访问此成员.( gh-24271 )
已删除
NPY_INTPLTR以避免混淆(请参阅intp重新定义).( gh-24888 )
高级索引
MapIter和相关的 API 已被删除. 它的(真正)公共部分没有经过充分的测试,并且只有一个已知的用户 (Theano). 使其私有将简化对加速ufunc.at的改进,使高级索引更易于维护,并且对于将数组的最大维度数增加到 64 非常重要. 如果此 API 对您很重要,请告知我们,以便我们可以一起找到解决方案.( gh-25138 )
移除了
NPY_MAX_ELSIZE宏,因为它仅仅反映了内置的数值类型,并且没有内部用途.( gh-25149 )
PyArray_REFCNT和NPY_REFCOUNT被移除.请使用Py_REFCNT代替.( gh-25156 )
PyArrayFlags_Type和PyArray_NewFlagsObject以及PyArrayFlagsObject现在是私有的.没有已知的用例;如果需要,请使用 Python API.PyArray_MoveInto,PyArray_CastTo,PyArray_CastAnyTo被移除,请使用PyArray_CopyInto,如果绝对需要,可以使用PyArray_CopyAnyInto(后者执行扁平复制).PyArray_FillObjectArray被移除,它唯一真正的用途是实现np.empty.创建一个新的空数组或使用PyArray_FillWithScalar()(减少对现有对象的引用).PyArray_CompareUCS4和PyArray_CompareString被移除.使用标准的 C 字符串比较函数.PyArray_ISPYTHON被移除,因为它具有误导性,没有已知的用例,并且很容易被替换.PyArray_FieldNames被移除,因为不清楚它有什么用处.在某些可能的用例中,它也具有不正确的语义.PyArray_TypestrConvert被移除,因为它似乎用词不当,并且不太可能被任何人使用.如果您知道大小或仅限于少数类型,请显式使用它,否则通过 Python 字符串.( gh-25292 )
PyDataType_GetDatetimeMetaData被移除,至少从 NumPy 1.7 开始它实际上没有做任何事情.( gh-25802 )
PyArray_GetCastFunc被移除. 请注意,自定义的旧版用户 dtype 仍然可以将其 castfunc 作为其实现提供,但现在已删除对它们的任何访问. 原因是 NumPy 多年来从未在内部使用过这些. 如果您使用简单的数值类型,请直接使用 C 转换. 如果您需要替代方案,请告诉我们,以便我们可以创建新的 API,例如PyArray_CastBuffer(),它可以根据 NumPy 版本使用旧的或新的转换函数.( gh-25161 )
新特性#
np.add 被扩展为可以与 unicode 和 bytes dtypes 一起使用.#
( gh-24858 )
一个新的 bitwise_count 函数#
这个新函数计算数字中 1 的位数. bitwise_count 适用于所有 numpy 整数类型和类整数对象.
>>> a = np.array([2**i - 1 for i in range(16)])
>>> np.bitwise_count(a)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
dtype=uint8)
( gh-19355 )
macOS Accelerate 支持,包括 ILP64#
增加了对更新的 Accelerate BLAS/LAPACK 库的支持,包括 macOS 13.3 中的 ILP64(64 位整数)支持.这带来了 arm64 支持,并为常用线性代数运算带来了高达 10 倍的显着性能提升.如果在构建时选择了 Accelerate,或者如果未完成显式的 BLAS 库选择,则如果可用,将自动使用 13.3+ 版本.
( gh-24053 )
二进制 wheel 也是可用的.在 macOS >=14.0 上,从 PyPI 安装 NumPy 的用户将获得针对 Accelerate 而不是 OpenBLAS 构建的 wheel.
( gh-25255 )
选择对分位数和百分位数函数使用权重#
现在 quantile , percentile , nanquantile 和 nanpercentile 可以使用 weights 关键字.只有 method="inverted_cdf" 支持权重.
( gh-24254 )
改进的 CPU 优化跟踪#
现在提供了一种新的追踪机制,可以跟踪 NumPy 库中每个优化函数(即使用硬件特定的 SIMD 指令)的启用目标. 通过此增强功能,可以精确监控调度函数的已启用 CPU 调度目标.
一个新的函数 opt_func_info 已添加到新的命名空间 numpy.lib.introspect ,提供此跟踪功能. 此函数允许您根据函数名称和数据类型签名检索有关已启用目标的信息.
( gh-24420 )
f2py 的新 Meson 后端#
编译模式下的 f2py (即 f2py -c ) 现在接受 --backend meson 选项. 这是 Python >=3.12 的默认选项. 对于较旧的 Python 版本, f2py 仍将默认为 --backend distutils .
为了在实际用例中支持这一点,在编译模式下, f2py 会多次使用 --dep 标志,该标志映射到 meson 后端中的 dependency() 调用,而在 distutils 后端中则不起任何作用.
仅将 f2py 用作代码生成器(即没有 -c )的用户没有任何更改.
( gh-24532 )
bind(c) 对 f2py 的支持#
函数和子例程都可以使用 bind(c) 进行注释. f2py 将处理正确的类型映射,并为其他 C 接口保留唯一的标签.
注意:默认情况下, f2py 绑定不遵循 bind(c, name = 'routine_name_other_than_fortran_routine') ,因为带有 name 的 bind(c) 旨在保证 C 和 Fortran 中的名称相同,而不是在 Python 和 Fortran 中.
( gh-24555 )
几个测试函数的新 strict 选项#
strict 关键字现在可用于 assert_allclose , assert_equal 和 assert_array_less . 设置 strict=True 将禁用标量的广播行为,并确保输入数组具有相同的数据类型.
添加 np.core.umath.find 和 np.core.umath.rfind UFuncs#
添加两个 find 和 rfind UFuncs,它们对 unicode 或字节字符串进行操作,并在 np.char 中使用. 它们的操作类似于 str.find 和 str.rfind .
( gh-24868 )
diagonal 和 trace 用于 numpy.linalg#
添加了 numpy.linalg.diagonal 和 numpy.linalg.trace ,它们是 numpy.diagonal 和 numpy.trace 的数组 API 标准兼容变体. 它们在定义二维子数组的默认轴选择方面有所不同.
( gh-24887 )
新的 long 和 ulong dtypes#
numpy.long 和 numpy.ulong 已添加为 NumPy 整数, 映射到 C 的 long 和 unsigned long . 在 NumPy 1.24 之前, numpy.long 是 Python 的 int 的别名.
( gh-24922 )
svdvals 用于 numpy.linalg#
添加了 numpy.linalg.svdvals . 它计算(一堆)矩阵的奇异值. 执行 np.svdvals(x) 与调用 np.svd(x, compute_uv=False, hermitian=False) 相同. 此函数与数组 API 标准兼容.
( gh-24940 )
一个新的 isdtype 函数#
添加了 numpy.isdtype ,以提供一种规范方式来根据数组 API 标准对 NumPy 的 dtypes 进行分类.
( gh-25054 )
一个新的 astype 函数#
添加了 numpy.astype ,以提供 numpy.ndarray.astype 方法的数组 API 标准兼容替代方案.
( gh-25079 )
与数组 API 兼容的函数的别名#
添加了 13 个现有函数的别名,以提高与数组 API 标准的兼容性:
三角函数:
acos,acosh,asin,asinh,atan,atanh,atan2.按位运算:
bitwise_left_shift,bitwise_invert,bitwise_right_shift.其他:
concat,permute_dims,pow.在
numpy.linalg中:tensordot,matmul.
( gh-25086 )
新的 unique_* 函数#
已添加 unique_all , unique_counts , unique_inverse 和 unique_values 函数. 它们提供了具有不同标志集的 unique 的功能. 它们与数组 API 标准兼容,并且由于它们返回的数组数量不依赖于输入参数的值,因此它们更容易成为 JIT 编译的目标.
( gh-25088 )
ndarray 的矩阵转置支持#
NumPy 现在提供对计算数组(或数组堆栈)的矩阵转置的支持. 矩阵转置等效于交换数组的最后两个轴. np.ndarray 和 np.ma.MaskedArray 现在都公开了一个 .mT 属性,并且有一个匹配的新 numpy.matrix_transpose 函数.
( gh-23762 )
numpy.linalg 的数组 API 兼容函数#
添加了六个新函数和两个别名,以提高与 numpy.linalg 的数组 API 标准的兼容性:
numpy.linalg.matrix_norm- 计算矩阵(或矩阵堆栈)的矩阵范数.numpy.linalg.vector_norm- 计算向量(或批量向量)的向量范数.numpy.vecdot- 计算两个数组的(向量)点积.numpy.linalg.vecdot-numpy.vecdot的别名.numpy.linalg.matrix_transpose-numpy.matrix_transpose的别名.( gh-25155 )
已添加
numpy.linalg.outer. 它计算两个向量的外积. 它与numpy.outer的不同之处在于它只接受一维数组. 此函数与数组 API 标准兼容.( gh-25101 )
已添加
numpy.linalg.cross. 它计算两个(3 维向量的数组)的叉积. 它与numpy.cross的不同之处在于它只接受三维向量. 此函数与数组 API 标准兼容.( gh-25145 )
var 和 std 的 correction 参数#
已将 correction 参数添加到 var 和 std ,它是与数组 API 标准兼容的 ddof 替代方案. 由于两个参数的用途相似,因此只能同时提供其中一个.
( gh-25169 )
ndarray.device 和 ndarray.to_device#
为了与数组 API 标准兼容,已将 ndarray.device 属性和 ndarray.to_device 方法添加到 numpy.ndarray .
此外, device 仅关键字参数已添加到:asarray , arange , empty , empty_like , eye , full , full_like , linspace , ones , ones_like , zeros 和 zeros_like .
对于所有这些新参数,仅支持 device="cpu" .
( gh-25233 )
StringDType 已添加到 NumPy#
我们添加了一种新的可变宽度 UTF-8 编码字符串数据类型,实现了“Python 字符串的 NumPy 数组”,包括对用户提供的缺失数据哨兵值的支持.它旨在作为 Python 字符串数组和使用 object dtype 的缺失数据哨兵值的直接替代品. 有关更多详细信息,请参见 NEP 55 和 the documentation .
( gh-25347 )
cholesky 和 pinv 的新关键字#
upper 和 rtol 关键字已分别添加到 numpy.linalg.cholesky 和 numpy.linalg.pinv ,以提高数组 API 标准的兼容性.
对于 pinv ,如果未指定 rcond 和 rtol ,则使用 rcond 的默认值.我们计划在将来弃用并删除 rcond .
( gh-25388 )
sort , argsort 和 linalg.matrix_rank 的新关键字#
添加了新的关键字参数以提高数组 API 标准的兼容性:
rtol已添加到matrix_rank.
( gh-25437 )
用于字符串 ufuncs 的新的 numpy.strings 命名空间#
NumPy 现在将一些字符串操作实现为 ufuncs. 旧的 np.char 命名空间仍然可用,并且在可能的情况下,该命名空间中的字符串操作函数已更新为使用新的 ufuncs,从而大大提高了它们的性能.
如果可能,我们建议更新代码以使用 np.strings 中的函数而不是 np.char .将来,我们可能会弃用 np.char 而支持 np.strings .
( gh-25463 )
numpy.fft 支持不同的精度和就地计算#
numpy.fft 中的各种 FFT 例程现在根据输入精度以 float,double 或 long double 精度原生执行计算,而不是始终以 double 精度计算.因此,计算现在对于 single 精度会降低精度,而对于 long double 精度会提高精度.输出数组的数据类型现在将进行相应的调整.
此外,所有 FFT 例程都获得了一个 out 参数,该参数可用于就地计算.
( gh-25536 )
configtool 和 pkg-config 支持#
一个新的 numpy-config CLI 脚本可用,可以查询 NumPy 版本和使用 NumPy C API 所需的编译标志.这将允许构建系统更好地支持将 NumPy 用作依赖项.此外,现在 Numpy 中包含一个 numpy.pc pkg-config 文件. 为了找到它与 PKG_CONFIG_PATH 一起使用的位置,请使用 numpy-config --pkgconfigdir .
( gh-25730 )
主命名空间中的 Array API 标准支持#
主 numpy 命名空间现在支持 array API 标准. 有关详细信息,请参见 Array API 标准兼容性 .
( gh-25911 )
改进#
any , all 和逻辑 ufuncs 现在支持字符串.#
( gh-25651 )
整数序列作为 memmap 的 shape 参数#
现在可以使用任何整数序列作为 shape 参数来创建 numpy.memmap ,例如整数列表或 numpy 数组. 以前,仅可以使用元组和 int 类型,否则会引发错误.
( gh-23729 )
errstate 现在更快且上下文安全#
numpy.errstate 上下文管理器/装饰器现在更快且更安全. 以前,它不是上下文安全的,并且存在(罕见的)线程安全问题.
( gh-23936 )
使用 Highway 的 VQSort 提高了 AArch64 快速排序的速度#
首次引入 Google Highway 库,在 AArch64 上使用 VQSort. 在某些情况下,执行时间最多可提高 16 倍,有关基准测试结果,请参见 PR. 将来将扩展到其他平台.
( gh-24018 )
复数类型 - 底层 C 类型更改#
NumPy 所有复数类型的底层 C 类型已更改为使用 C99 复数类型.
虽然此更改不影响复数类型的内存布局,但它更改了用于直接检索或写入复数的实部或虚部的 API,因为直接字段访问(如
c.real或c.imag中)不再是一种选择. 您现在可以使用numpy/npy_math.h中提供的实用程序来执行这些操作,如下所示:npy_cdouble c; npy_csetreal(&c, 1.0); npy_csetimag(&c, 0.0); printf("%d + %di\n", npy_creal(c), npy_cimag(c));
为了简化跨版本兼容性,已添加等效的宏和兼容性层,下游包可以使用它们来继续支持 NumPy 1.x 和 2.x. 有关更多信息,请参见 对复数的支持 .
numpy/npy_common.h现在包含complex.h,这意味着complex现在是保留关键字.
( gh-24085 )
iso_c_binding 支持和改进的 f2py 公共块#
以前,用户必须定义自己的自定义 f2cmap 文件才能使用 Fortran2003 iso_c_binding 本征模块定义的类型映射.现在 f2py 本身原生支持这些类型映射.
( gh-24555 )
f2py 现在可以处理具有来自模块的 kind 规范的 common 块.这进一步扩展了诸如 iso_fortran_env 和 iso_c_binding 等内在函数的使用.
( gh-25186 )
自动在函数的第三个参数上调用 str ,例如 assert_equal#
现在,函数的第三个参数(例如 assert_equal )会自动调用 str . 这样,它模仿了内置的 assert 语句,其中 assert_equal(a, b, obj) 的工作方式类似于 assert a == b, obj .
( gh-24877 )
支持 isclose , allclose 中的类数组 atol / rtol#
isclose 和 allclose 中的关键字 atol 和 rtol 现在接受标量和数组. 如果给定一个数组,则该数组必须广播到前两个数组参数的形状.
( gh-24878 )
测试函数中一致的失败消息#
以前,一些 numpy.testing 断言打印的消息将实际和期望的结果称为 x 和 y . 现在,这些值始终称为 ACTUAL 和 DESIRED .
( gh-24931 )
n-D FFT 变换允许 s[i] == -1#
fftn , ifftn , rfftn , irfftn , fft2 , ifft2 , rfft2 和 irfft2 函数现在沿轴 i 使用整个输入数组(如果 s[i] == -1 ),这符合数组 API 标准.
( gh-25495 )
为有限 API 保护 PyArrayScalar_VAL 和 PyUnicodeScalarObject#
PyUnicodeScalarObject 包含一个 PyUnicodeObject ,当使用 Py_LIMITED_API 时它是不可用的.添加保护措施来隐藏它,并因此也隐藏 PyArrayScalar_VAL 宏.
( gh-25531 )
变更#
np.gradient()现在返回一个元组而不是列表,使得返回值不可变.( gh-23861 )
np.errstate是完全上下文和线程安全的,现在只能进入一次.np.setbufsize现在与np.errstate()绑定:离开np.errstate上下文也会重置bufsize.( gh-23936 )
引入了一个新的公共
np.lib.array_utils子模块,目前包含三个函数:byte_bounds(从np.lib.utils移动过来),normalize_axis_tuple和normalize_axis_index.( gh-24540 )
引入
numpy.bool作为 NumPy 布尔 dtype 的新规范名称,并使numpy.bool_成为它的别名.请注意,在 NumPy 1.24 之前,np.bool是 Python 内置bool的别名.新名称有助于数组 API 标准兼容性,并且是一个更直观的名称.( gh-25080 )
dtype.flags值以前存储为有符号整数.这意味着对齐的 dtype 结构标志导致设置负标志(-128 而不是 128).此标志现在以无符号(正数)形式存储.手动检查标志的代码可能需要调整.这可能包括使用 Cython 0.29.x 编译的代码.( gh-25816 )
NumPy 标量的表示已更改#
按照 NEP 51 的规定,标量表示已更新,以包含类型信息,以避免与 Python 标量混淆.
标量现在打印为 np.float64(3.0) 而不仅仅是 3.0 .这可能会扰乱存储数字表示形式(例如,存储到文件)的工作流程,使其更难读取它们.应将其存储为显式字符串,例如通过使用 str() 或 f"{scalar!s}" .目前,受影响的用户可以使用 np.set_printoptions(legacy="1.25") 来获得旧的行为(可能有一些例外).如果测试代码片段,下游项目的文档可能需要更大的更新.我们正在开发 doctest-plus 的工具来方便更新.
( gh-22449 )
NumPy 字符串的真值已更改#
NumPy 字符串以前对其如何定义字符串是 True 还是 False 不一致,并且该定义与 Python 使用的定义不匹配.现在,当字符串为非空时,它被认为是 True ,当字符串为空时,它被认为是 False .这改变了以下不同的情况:
从字符串到布尔值的转换以前大致等同于
string_array.astype(np.int64).astype(bool),这意味着只有有效的整数才能被转换.现在,字符串"0"将被认为是True,因为它不是空的.如果您需要旧的行为,您可以使用上述步骤(首先转换为整数)或string_array == "0"(如果输入始终只是0或1).要在旧的 NumPy 版本上获得新的结果,请使用string_array != "".np.nonzero(string_array)以前忽略了空格,因此仅包含空格的字符串被认为是False.现在空格被认为是True.
此更改不影响 np.loadtxt , np.fromstring 或 np.genfromtxt .前两个仍然使用整数定义,而 genfromtxt 继续匹配 "true" (忽略大小写).但是,如果将 np.bool_ 用作转换器,则结果将发生变化.
这项更改确实会影响 np.fromregex ,因为它使用直接赋值.
( gh-23871 )
为 var 和 std 函数添加了 mean 关键字#
通常,在需要标准差时,也需要平均值.方差和平均值也是如此.到目前为止,平均值会被计算两次,此处为 var 和 std 函数引入的更改允许传入预先计算的平均值作为关键字参数.有关详细信息和说明加速的示例,请参见文档字符串.
( gh-24126 )
删除构造时带有timezone的datetime64弃用警告#
每当提供的 datetime 字符串中包含时区时, numpy.datetime64 方法现在会发出 UserWarning 而不是 DeprecationWarning.
( gh-24193 )
现在,在 64 位 Windows 上,默认整数 dtype 为 64 位#
现在,在所有 64 位系统上,默认的 NumPy 整数都是 64 位,因为 Windows 上历史悠久的 32 位默认值是常见的问题来源.大多数用户应该不会注意到这一点.主要问题可能发生在与用 C 等编译语言编写的库交互的代码中.有关更多信息,请参见 Windows 默认整数 .
( gh-24224 )
将 numpy.core 重命名为 numpy._core#
访问 numpy.core 现在会发出 DeprecationWarning. 在实践中,我们发现大多数下游对 numpy.core 的使用都是为了访问主 numpy 名称空间中可用的功能. 如果由于某种原因,您正在使用 numpy.core 中主 numpy 名称空间中不可用的功能,这意味着您可能正在使用私有的 NumPy 内部组件. 您仍然可以通过 numpy._core 访问这些内部组件,而不会出现弃用警告,但是我们不为 NumPy 内部组件提供任何向后兼容性保证. 如果您认为出现了错误并且需要公开某些内容,请提出问题.
( gh-24634 )
已删除“relaxed strides”调试构建选项,该选项以前通过 NPY_RELAXED_STRIDES_DEBUG 环境变量或 -Drelaxed-strides-debug config-settings 标志启用.
( gh-24717 )
重新定义 np.intp / np.uintp (几乎从来没有改变)#
由于这些类型的实际使用几乎总是与 size_t / Py_ssize_t 的使用相匹配,因此现在这是 C 中的定义. 以前,它与 intptr_t 和 uintptr_t 匹配,这通常会略有不正确. 由于这些类型的大小仅在非常小的平台上有所不同,因此这对绝大多数机器没有影响.
但是,这意味着:
指针可能不一定再适合
intp类型的数组. 但是,仍然可以使用p和P字符代码.仍然可以通过
PyArray_DescrFromType('p')以跨平台方式在 C 中创建intptr_t或uintptr_t类型的数组.引入了新的字符代码
nN.现在,在解析为
npy_intp类型的参数时,可以正确使用 Python C-API 函数.
( gh-24888 )
numpy.fft.helper 私有化#
numpy.fft.helper 已重命名为 numpy.fft._helper ,以表明它是一个私有子模块. 它导出的所有公共函数都应从 numpy.fft 访问.
( gh-24945 )
numpy.linalg.linalg 变为私有#
numpy.linalg.linalg 被重命名为 numpy.linalg._linalg ,以表明它是一个私有子模块.它导出的所有公共函数都应该从 numpy.linalg 访问.
( gh-24946 )
越界轴与 axis=None 不等同#
在某些情况下, axis=32 或者对于 concatenate 任何大的值都与 axis=None 相同.除了 concatenate 之外,这种做法已被弃用.任何越界的 axis 值现在都会报错,请确保使用 axis=None .
( gh-25149 )
array 和 asarray 构造函数中 copy 关键字的新含义#
现在, numpy.array 和 numpy.asarray 支持 copy 参数的三个值:
None- 仅在必要时才进行复制.True- 始终进行复制.False- 永远不进行复制.如果需要复制,则会引发ValueError.
False 的含义发生了变化,因为它现在在需要复制时会引发异常.
( gh-25168 )
__array__ 特殊方法现在接受 copy 关键字参数.#
在 copy 将被设置为非默认值的情况下(例如,在调用 np.asarray(some_object, copy=False) 中),NumPy 将会把 copy 传递给 __array__ 特殊方法.目前,如果在此之后引发了意外的关键字参数错误,NumPy 将打印一条警告并重新尝试,而不使用 copy 关键字参数.实现 __array__ 协议的对象应该接受一个 copy 关键字参数,其含义与传递给 numpy.array 或 numpy.asarray 时相同.
( gh-25168 )
清理使用带逗号的字符串初始化 numpy.dtype 的过程#
带逗号的字符串的解释略有变化,即尾随逗号现在将始终创建一个结构化的 dtype.例如,之前 np.dtype("i") 和 np.dtype("i,") 被视为相同,现在 np.dtype("i,") 将创建一个具有单个字段的结构化 dtype.这类似于 np.dtype("i,i") 创建一个具有两个字段的结构化 dtype,并使行为与元组的预期行为保持一致.
与此同时,使用括号括起来的单个数字来表示子数组形状(如 np.dtype("(2)i,") 中)已被弃用.相反,应该使用 np.dtype("(2,)i") 或 np.dtype("2i") .最终,使用带括号的数字将引发异常,就像没有逗号的初始化(如 np.dtype("(2)i") )一样.
( gh-25434 )
复数符号计算方式的更改#
按照 array API 标准,复数符号现在计算为 z / |z| (而不是取实部的符号,除非实部为零,否则返回虚部的符号,这种不太合乎逻辑的情况).和实数一样,如果 z==0 ,则返回零.
( gh-25441 )
返回数组列表的函数的返回类型#
返回 ndarray 列表的函数已更改为返回 ndarray 的元组.每当返回数组序列时,始终返回元组,使 JIT 编译器(如 Numba)以及某些情况下的静态类型检查器更容易支持这些函数.已更改的函数包括:atleast_1d , atleast_2d , atleast_3d , broadcast_arrays , meshgrid , ogrid , histogramdd .
np.unique 对多维输入返回 return_inverse 形状#
当多维输入传递给带有 return_inverse=True 的 np.unique 时, unique_inverse 输出现在的形状使得当 axis=None 时可以使用 np.take(unique, unique_inverse) 直接重建输入,否则可以使用 np.take_along_axis(unique, unique_inverse, axis=axis) 重建输入.
备注
此更改在 2.0.1 中被撤销,除了 axis=None .正确的重建方式始终为 np.take(unique, unique_inverse, axis=axis) .当需要支持 2.0.0 时,请将 unique_inverse.reshape(-1) 添加到代码中.
any 和 all 为对象数组返回布尔值#
any 和 all 函数和方法现在也为对象数组返回布尔值.以前,它们执行的归约类似于 Python or 和 and 运算符,其计算结果为其中一个参数.您可以使用 np.logical_or.reduce 和 np.logical_and.reduce 来实现之前的行为.
( gh-25712 )
np.can_cast 不能在 Python int,float 或 complex 上调用#
np.can_cast 不能再使用 Python int,float 或 complex 实例调用.这是因为 NEP 50 意味着 can_cast 的结果不得依赖于传入的值.不幸的是,对于 Python 标量,是否应将强制转换视为 "same_kind" 或 "safe" 可能取决于上下文和值,因此目前尚未实现.在某些情况下,这意味着您可能必须为以下情况添加特定路径: if type(obj) in (int, float, complex): ... .
( gh-26393 )