NumPy 2.0.0 发布说明#
NumPy 2.0.0 是自2006年以来的第一个重大发布.这是自上次功能发布以来11个月开发的结果,由212名贡献者通过1078个拉取请求完成.它包含了许多令人兴奋的新功能以及对Python和C API的更改.
这个主要版本包括了一些在常规次要(功能)版本中无法实现的重大更改 - 包括 ABI 中断、类型提升规则的更改以及 API 更改,这些更改在 1.26.x 中可能没有发出弃用警告.关于如何适应 NumPy 2.0 中的更改的关键文档,除了这些发布说明外,还包括:
The NumPy 2.0 迁移指南
在 面向下游包作者 中的 NumPy 2.0 特定建议
亮点#
此版本的重点包括:
新功能:
一个新的可变长度字符串数据类型,`~numpy.dtypes.StringDType` 和一个新的
numpy.strings
命名空间,包含用于字符串操作的高性能ufuncs.在所有
numpy.fft
函数中支持float32
和longdouble
在主
numpy
命名空间中对数组 API 标准的支持.
性能提升:
排序函数 (
sort
,argsort
,partition
,argpartition
) 通过使用 Intel x86-simd-sort 和 Google Highway 库得到了加速,并且可能会看到大的(硬件特定的)速度提升.macOS Accelerate 支持以及适用于 macOS >=14 的二进制轮子,对 macOS 上的线性代数操作有显著的性能提升,并且轮子的大小约为原来的三分之一.
numpy.char
固定长度字符串操作通过实现支持StringDType
的 ufuncs 得到了加速,除了固定长度字符串 dtypes 之外.一个新的跟踪和自省API,`~numpy.lib.introspect.opt_func_info`,用于确定哪些特定于硬件的内核是可用的并且将被分派到.
numpy.save
现在使用 pickle 协议版本 4 来保存对象类型的数组,这允许保存大于 4GB 的 pickle 对象,并且对于大数组的保存速度提高了约 5%.
Python API 改进:
公共和私有API之间有明确的区分,采用了新的 模块结构 ,每个公共函数现在都在一个地方可用.
许多不推荐使用的函数和别名的移除.这应该使学习和使用 NumPy 变得更加容易.主命名空间中的对象数量减少了约 10%,在
numpy.lib
中减少了约 80%.规范的 dtype 名称 和一个新的
isdtype
内省函数,
C API 改进:
一个新的 用于创建自定义数据类型的公共C API,
移除了许多过时的函数和宏,并将内部私有部分隐藏,以简化未来的扩展性,
新的、更易于使用的初始化函数:
PyArray_ImportNumPyAPI
和PyUFunc_ImportUFuncAPI
.
改进的行为:
对类型提升行为的改进通过采用 NEP 50 进行了更改.这修复了许多用户对提升的意外,这些意外以前通常依赖于输入数组的数据值,而不是仅依赖于它们的 dtypes.请参阅 NEP 和 numpy-2-迁移指南 了解详情,因为这一更改可能导致输出 dtypes 的变化和混合 dtype 操作的精度降低.
在Windows上,默认的整数类型现在是
int64
而不是int32
,与其他平台的行为相匹配.数组的最大维度数从32改为64
文档:
参考指南导航得到了显著改进,现在有关于 NumPy 的 模块结构 的文档.
The building from source documentation was completely rewritten,
此外,对 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
已被移除.作为移除功能的替代方案,可以使用在 Spyder 或 Jupyter Notebook 等 IDE 中可用的变量浏览器.(gh-24321)
在
numpy.exceptions
中出现的警告和异常(例如,`~numpy.exceptions.ComplexWarning`,`~numpy.exceptions.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
已被移除.请使用np.asarray
并指定适当的 dtype 代替.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
命名空间进行常规使用,或者使用单独的array-api-strict
包进行numpy.array_api
主要使用的合规性测试用例.(gh-25911)
__array_prepare__
已被移除#
在运行正常 ufunc 调用(不是广义 ufuncs、归约等)的计算之前,会调用名为 __array_prepare__
的 UFuncs.在某些线性代数函数的结果上,也会调用该函数,而不是 __array_wrap__
.
它现在已被移除.如果你使用它,请迁移到 __array_ufunc__
或依赖于 __array_wrap__
,后者在所有情况下都会被调用,尽管只有在结果数组被填充之后.在这些代码路径中,``__array_wrap__`` 现在将传递一个基类,而不是子类数组.
(gh-25105)
弃用#
np.compat
已被弃用,因为不再支持 Python 2.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)
使用关键字参数
x
和y
与函数assert_array_equal
和assert_array_almost_equal
已被弃用.请将前两个参数作为位置参数传递.(gh-24978)
numpy.fft
对参数中包含 None 值的 n 维变换的弃用#
使用 fftn
, ifftn
, rfftn
, irfftn
, fft2
, ifft2
, rfft2
或 irfft2
时,如果 s
参数设置为非 None
的值,而 axes
参数设置为 None
,这已被弃用,以符合数组 API 标准.要保留当前行为,请为维度为 k 的数组向 axes
传递一个序列 [0, …, k-1].
此外,将包含 None
值的数组传递给 s
已被弃用,因为参数在 NumPy 文档和数组 API 规范中都记录为接受整数序列.要使用相应一维变换的默认行为,请传递与其 n
参数的默认值匹配的值.要使用每个轴的默认行为,可以省略 s
参数.
(gh-25495)
np.linalg.lstsq
现在默认使用一个新的 rcond
值#
lstsq
现在使用新的 rcond 值,即机器精度的 max(M, N)
倍.以前,使用的是机器精度,但会给出 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
和fastputmask
ArrFuncs
的弃用现在已最终确定.已弃用的函数
fastCopyAndTranspose
及其 C 语言版本现已移除.PyArray_ScalarFromObject
的弃用现在已最终确定.(gh-24312)
np.msort
已被移除.作为替代,应使用np.sort(a, axis=0)
.(gh-24494)
np.dtype(("f8", 1)
现在将返回一个形状为1的子数组数据类型,而不是非子数组数据类型.(gh-25761)
分配给
.data
属性的 ndarray 是不允许的,并且会引发错误.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
和.pyf
CLI 组合.当传递多个.pyf
文件时,会引发错误.当同时传递-m
和.pyf
时,会发出警告,并且提供的-m
名称将被忽略.(gh-25181)
f2py.compile()
助手已被移除,因为它泄露内存,多年来一直被标记为实验性,并且是作为subprocess.run
的薄包装实现的.它也是测试瓶颈之一.有关完整的理由,请参见 gh-25122.它还使用了几个np.distutils
特性,这些特性太脆弱,无法移植到与meson
一起工作.用户被敦促将调用
f2py.compile
替换为调用subprocess.run("python", "-m", "numpy.f2py",...
,并使用环境变量与meson
进行交互.`本地文件 <https://mesonbuild.com/Machine-files.html>`_ 也是一个选项.(gh-25193)
排序函数行为的小变化#
由于算法的变化和使用SIMD代码,与1.26.x相比,2.0.0中使用不稳定方法的排序函数可能会返回略有不同的结果.这包括`~numpy.argsort`和`~numpy.argpartition`的默认方法.
在 np.solve
中广播时消除了歧义#
对于 np.solve(a, b)
的广播规则,当 b
的维度比 a
少1时,是模糊的.这已经在向后不兼容的方式中得到解决,现在符合 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 内置 DTypes.特别是新的字符串 DType 可能无法与处理旧版 DTypes 的代码正确配合.(gh-25347)
C-API 现在只导出数组访问器的静态内联函数版本(以前这取决于使用”已弃用的API”).虽然我们不鼓励这样做,但仍然可以直接使用结构体字段.
(gh-25789)
NumPy 现在定义了
PyArray_Pack
来设置单个内存地址.与PyArray_SETITEM
不同,此函数相当于设置单个数组项,并且不需要 NumPy 数组输入.(gh-25954)
->f
槽位已从PyArray_Descr
中移除.如果你使用这个槽位,请将其访问替换为PyDataType_GetArrFuncs``(参见其文档和 :ref:`numpy-2-migration-guide`).在某些情况下,使用其他函数如 ``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.否则,访问将通过 Python,除非他们使用PyDataType_FLAGCHK
.(gh-25816)
C API 和 Cython 绑定中暴露的日期时间功能#
函数 NpyDatetime_ConvertDatetime64ToDatetimeStruct
, NpyDatetime_ConvertDatetimeStructToDatetime64
, NpyDatetime_ConvertPyDateTimeToDatetimeStruct
, NpyDatetime_GetDatetimeISO8601StrLen
, NpyDatetime_MakeISO8601Datetime
, 和 NpyDatetime_ParseISO8601Datetime
已被添加到 C API 中,以便在外部库中方便地在字符串、Python 日期时间和 NumPy 日期时间之间进行转换.
(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,不幸的是有必要破坏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 支持进行编译,否则 elsize
和 alignment
字段现在必须通过 PyDataType_ELSIZE
、PyDataType_SET_ELSIZE
和 PyDataType_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 <numpy/numpy>`__ 脚本可能有助于将其转换为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()``(对现有对象进行 decrefs).PyArray_CompareUCS4
和PyArray_CompareString
已被移除.请使用标准的C字符串比较函数.PyArray_ISPYTHON
已被移除,因为它具有误导性,没有已知的用例,并且很容易被替代.PyArray_FieldNames
已被移除,因为它不清楚有什么用处.在某些可能的使用情况下,它的语义也是不正确的.PyArray_TypestrConvert
已被移除,因为它似乎是一个用词不当的名称,不太可能被任何人使用.如果你知道大小或仅限于少数类型,只需明确使用它,否则通过 Python 字符串进行操作.(gh-25292)
PyDataType_GetDatetimeMetaData
已被移除,自至少 NumPy 1.7 以来它实际上没有任何作用.(gh-25802)
PyArray_GetCastFunc
已被移除.请注意,自定义的传统用户数据类型仍然可以提供 castfunc 作为其实现,但任何对它们的访问现在已被移除.这样做的原因是 NumPy 多年来从未在内部使用过这些.如果您使用简单的数值类型,请直接使用 C 语言的类型转换.如果您需要替代方案,请告知我们,以便我们创建新的 API,例如PyArray_CastBuffer()
,它可以根据 NumPy 版本使用旧的或新的类型转换函数.(gh-25161)
新功能#
np.add
被扩展以支持 unicode
和 bytes
数据类型.#
(gh-24858)
一个新的 bitwise_count
函数#
这个新函数计算一个数字中1-bit的数量.`~numpy.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#
在 macOS 13.3 中增加了对更新后的 Accelerate BLAS/LAPACK 库的支持,包括 ILP64(64 位整数)支持.这带来了 arm64 支持,以及常用线性代数操作性能提升高达 10 倍.当在构建时选择 Accelerate,或者如果没有明确选择 BLAS 库,如果可用,将自动使用 13.3+ 版本.
(gh-24053)
二进制轮子也可用.在 macOS >=14.0 上,从 PyPI 安装 NumPy 的用户将获得针对 Accelerate 而不是 OpenBLAS 构建的轮子.
(gh-25255)
用于分位数和百分位数函数的权重选项#
weights
关键字现在可用于 quantile
、percentile
、nanquantile
和 nanpercentile
.只有 method="inverted_cdf"
支持权重.
(gh-24254)
改进的 CPU 优化跟踪#
一个新的跟踪机制可用,该机制能够跟踪NumPy库中每个优化函数的启用目标(即使用特定硬件SIMD指令的函数).通过这一增强,可以精确监控已分派函数的启用CPU调度目标.
一个新的函数名为 opt_func_info
已添加到新的命名空间 numpy.lib.introspect
中,提供了这种跟踪功能.此函数允许您根据函数名称和数据类型签名检索有关已启用目标的信息.
(gh-24420)
一个新的 Meson 后端用于 f2py
#
在编译模式下(即 f2py -c
),``f2py`` 现在接受 --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接口的唯一标签.
注意: bind(c, name = 'routine_name_other_than_fortran_routine')
由于设计原因,不会被 f2py
绑定所接受,因为 bind(c)
加上 name
仅保证在 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
已添加,它们是与数组 API 标准兼容的 numpy.diagonal
和 numpy.trace
变体.它们在定义 2-D 子数组的默认轴选择上有所不同.
(gh-24887)
新的 long
和 ulong
数据类型#
numpy.long
和 numpy.ulong
已被添加为映射到 C 的 long
和 unsigned long
的 NumPy 整数.在 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
被添加以提供一个与数组 API 标准兼容的替代 numpy.ndarray.astype
方法.
(gh-25079)
兼容 Array 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)
ndarrays 的矩阵转置支持#
NumPy 现在提供计算数组(或数组堆栈)的矩阵转置的支持.矩阵转置相当于交换数组的最后两个轴.``np.ndarray`` 和 np.ma.MaskedArray
现在都公开了一个 .mT
属性,并且有一个匹配的新 numpy.matrix_transpose
函数.
(gh-23762)
适用于 numpy.linalg
的数组 API 兼容函数#
为了提高与 numpy.linalg
的 Array 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
已添加.它计算两个(数组的)三维向量的叉积.它与numpy.cross
的区别在于只接受三维向量.此函数与数组 API 标准兼容.(gh-25145)
var
和 std
的 correction
参数#
为 var
和 std
添加了 correction
参数,这是一个与数组 API 标准兼容的 ddof
替代方案.由于这两个参数服务于相似的目的,只能同时提供其中一个.
(gh-25169)
ndarray.device
和 ndarray.to_device
#
为 numpy.ndarray
添加了 ndarray.device
属性和 ndarray.to_device
方法,以实现数组 API 标准兼容性.
此外,``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 字符串数组和使用对象 dtype 的缺失数据哨兵的直接替代品.有关更多详细信息,请参见 NEP 55 和 文档.
(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)
新的 numpy.strings
命名空间用于字符串 ufuncs#
NumPy 现在将一些字符串操作实现为 ufuncs.旧的 np.char
命名空间仍然可用,并且在可能的情况下,该命名空间中的字符串操作函数已更新为使用新的 ufuncs,显著提高了它们的性能.
如果可能,我们建议更新代码以使用 np.strings
中的函数,而不是 np.char
.未来我们可能会弃用 np.char
而支持 np.strings
.
(gh-25463)
numpy.fft
支持不同精度和就地计算#
numpy.fft
中的各种 FFT 例程现在根据输入精度在本机进行浮点、双精度或长双精度计算,而不是总是以双精度计算.因此,对于单精度和长双精度,计算现在将变得不那么精确或更加精确.输出数组的数据类型现在将相应地进行调整.
此外,所有 FFT 例程都增加了一个 out
参数,可用于就地计算.
(gh-25536)
configtool 和 pkg-config 支持#
一个新的 numpy-config
CLI 脚本可用,可以查询 NumPy 版本和使用 NumPy C API 所需的编译标志.这将允许构建系统更好地支持将 NumPy 作为依赖项使用.此外,现在包含了一个 numpy.pc
pkg-config 文件.为了找到其位置以便与 PKG_CONFIG_PATH
一起使用,请使用 numpy-config --pkgconfigdir
.
(gh-25730)
主命名空间中的数组API标准支持#
主要的 numpy
命名空间现在支持数组 API 标准.详情请参见 数组 API 标准兼容性.
(gh-25911)
改进#
字符串现在被 any
、all
和逻辑 ufuncs 支持.#
(gh-25651)
作为 memmap
的形状参数的整数序列#
numpy.memmap
现在可以用任何整数序列作为 shape
参数创建,例如整数的列表或 numpy 数组.以前,只有元组和整数类型可以在不引发错误的情况下使用.
(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)
在像 assert_equal
这样的函数中,自动对第三个参数调用 str
#
像 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
函数现在如果 s[i] == -1
,则沿轴 i
使用整个输入数组,这与数组 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 布尔数据类型的新规范名称,并将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)
在用时区构造时移除datetime64弃用警告#
现在,每当提供的日期时间字符串中包含时区时,`numpy.datetime64` 方法会发出 UserWarning 而不是 DeprecationWarning.
(gh-24193)
在64位Windows上,默认的整数类型现在是64位.#
默认的 NumPy 整数现在在所有 64 位系统上都是 64 位的,因为历史上在 Windows 上的 32 位默认值是常见问题的来源.大多数用户应该不会注意到这一点.主要问题可能出现在与用编译语言(如 C)编写的库接口的代码中.有关更多信息,请参见 Windows 默认整数.
(gh-24224)
将 numpy.core
重命名为 numpy._core
#
访问 numpy.core
现在会发出一个 DeprecationWarning.实际上,我们发现大多数下游对 numpy.core
的使用是为了访问在主 numpy
命名空间中可用的功能.如果由于某些原因,您正在使用在主 numpy
命名空间中不可用的 numpy.core
中的功能,这意味着您可能正在使用私有 NumPy 内部结构.您仍然可以通过 numpy._core
访问这些内部结构而不会发出弃用警告,但我们不对 NumPy 内部结构提供任何向后兼容性保证.如果您认为这是一个错误并且某些内容需要公开,请提出问题.
(gh-24634)
“relaxed strides” 调试构建选项,之前通过 NPY_RELAXED_STRIDES_DEBUG
环境变量或 -Drelaxed-strides-debug
配置设置标志启用,已被移除.
(gh-24717)
重新定义 np.intp
/``np.uintp``(几乎不会有变化)#
由于这些类型的实际使用几乎总是与 size_t
/Py_ssize_t
的使用相匹配,这在 C 语言中现在是定义.以前,它匹配 intptr_t
和 uintptr_t
,这通常会是微妙的不正确.这对绝大多数机器没有影响,因为这些类型的大小仅在极其小众的平台上有所不同.
然而,这意味着:
指针可能不再适合放入
intp
类型的数组中.然而,``p`` 和P
字符代码仍然可以使用.在C语言中创建
intptr_t
或uintptr_t
类型的数组仍然可以通过PyArray_DescrFromType('p')
以跨平台的方式实现.新的字符代码
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`` 或对于任何大值的连接与 axis=None
相同.除了 concatenate
之外,这已被弃用.任何超出界限的轴值现在都会报错,请确保使用 axis=None
.
(gh-25149)
新的 copy
关键字含义用于 array
和 asarray
构造函数#
现在 numpy.array
和 numpy.asarray
支持 copy
参数的三个值:
None
- 只有在必要时才会进行复制.True
- 总是创建一个副本.False
- 从不进行复制.如果需要复制,则引发ValueError
.
False
的含义发生了变化,因为现在如果需要复制,它会引发异常.
(gh-25168)
__array__
特殊方法现在接受一个 copy
关键字参数.#
NumPy 会在某些情况下将 copy
传递给 __array__
特殊方法,此时它会被设置为非默认值(例如在调用 np.asarray(some_object, copy=False)
时).目前,如果在这一过程后引发了意外的关键字参数错误,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)
复杂符号计算方式的改变#
遵循数组 API 标准,复数符号现在计算为 z / |z|
(而不是取实部的符号,除非实部为零,在这种情况下返回虚部的符号,这种做法逻辑性较差).对于实数,如果 z==0
,则返回零.
(gh-25441)
返回类型为返回数组列表的函数#
返回 ndarrays 列表的函数已更改为返回 ndarrays 元组.无论何时返回数组序列,一致地返回元组使得像 Numba 这样的 JIT 编译器以及某些情况下的静态类型检查器更容易支持这些函数.更改的函数有:atleast_1d
、atleast_2d
、atleast_3d
、broadcast_arrays
、meshgrid
、ogrid
、histogramdd
.
np.unique
return_inverse
多维输入的形状#
当多维输入传递给 np.unique
并设置 return_inverse=True
时,``unique_inverse`` 输出现在被调整为可以直接使用 np.take(unique, unique_inverse)
在 axis=None
时重建输入,否则使用 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)