NumPy 1.21.0发行说明#

NumPy 1.21.0版本的亮点是

  • 持续的SIMD工作涵盖了更多的函数和平台,

  • 新的dtype基础结构和强制转换的初步工作,

  • 适用于Mac上的Python 3.8和Python 3.9的universal2 wheels,

  • 改进的文档,

  • 改进的注释,

  • 用于随机数的新 PCG64DXSM 位生成器.

此外,还有大量的错误修复和其他改进.

此版本支持的Python版本为3.7-3.9. 发布后将添加对Python 3.10的正式支持.

警告

使用gcc-11.1编译NumPy 1.20.0时存在未解决的问题.

  • 当运行测试时,优化级别 -O3 会导致许多不正确的警告.

  • 在某些硬件上,NumPy 会陷入无限循环.

新函数#

添加 PCG64DXSM BitGenerator#

在高度并行的上下文中,使用 PCG64 BitGenerator 已被证明存在统计弱点,这些弱点在 numpy 1.17 的首次发布时并不明显. 大多数用户永远不会观察到这种弱点,并且可以安全地继续使用 PCG64 . 我们引入了一种新的 PCG64DXSM BitGenerator ,它最终将成为未来版本中 default_rng 使用的新的默认 BitGenerator 实现. PCG64DXSM 解决了统计弱点,同时保留了 PCG64 的性能和特性.

有关更多详细信息,请参见 使用 PCG64DXSM 升级 PCG64 .

( gh-18906 )

已过期的弃用#

  • shape 参数 unravel_index 不能再作为 dims 关键字参数传递.(已在 NumPy 1.16 中弃用.)

    ( gh-17900 )

  • 函数 PyUFunc_GenericFunction 已被禁用. 它在 NumPy 1.19 中已被弃用.用户应使用 Python API 直接调用 ufunc.

    ( gh-18697 )

  • 函数 PyUFunc_SetUsesArraysAsData 已被禁用. 它在 NumPy 1.19 中已被弃用.

    ( gh-18697 )

  • PolyBase 已被删除(在 numpy 1.9.0 中已弃用). 请改用抽象 ABCPolyBase 类.

    ( gh-18963 )

  • 未使用的 PolyErrorPolyDomainError 异常已被删除.

    ( gh-18963 )

弃用#

.dtype 属性必须返回 dtype#

如果传递给 np.dtype 的对象的 .dtype 属性或作为 dtype=obj 参数传递的属性不是 dtype ,则现在会发出 DeprecationWarning . NumPy 将停止尝试递归地强制 .dtype 的结果.

( gh-13578 )

不完全匹配 numpy.convolvenumpy.correlate 的情况已被弃用#

当在函数中找到 mode 参数的大小写不敏感和/或不完全匹配项时, convolvecorrelate 现在会发出警告. 对于 mode 参数,请传递完整的 "same" , "valid" , "full" 字符串,而不是 "s" , "v" , "f" .

( gh-17492 )

np.typeDict 已被正式弃用#

np.typeDictnp.sctypeDict 的已弃用别名,并且已经存在超过 14 年(6689502). 现在,每当获取 np.typeDict 时,都会发出弃用警告.

( gh-17586 )

在类数组创建期间将引发异常#

当对象在访问特殊属性 __array____array_interface__ 期间引发异常时,此异常通常会被忽略. 现在,当异常不是 AttributeError 时,会发出警告. 要消除警告,必须调整引发异常的类型以引发 AttributeError .

( gh-19001 )

四个 ndarray.ctypes 方法已被弃用#

ndarray.ctypes 对象的四个方法已被弃用,因为它们是各自属性的(未记录的)实现伪像.

相关方法是:

  • _ctypes.get_data (请改用 _ctypes.data )

  • _ctypes.get_shape (请使用 _ctypes.shape 代替)

  • _ctypes.get_strides (请使用 _ctypes.strides 代替)

  • _ctypes.get_as_parameter (请使用 _ctypes._as_parameter_ 代替)

( gh-19031 )

已过期的弃用#

  • numpy.unravel_indexshape 参数不能再作为 dims 关键字参数传递.(在 NumPy 1.16 中已弃用.)

    ( gh-17900 )

  • 函数 PyUFunc_GenericFunction 已被禁用. 它在 NumPy 1.19 中已被弃用.用户应使用 Python API 直接调用 ufunc.

    ( gh-18697 )

  • 函数 PyUFunc_SetUsesArraysAsData 已被禁用. 它在 NumPy 1.19 中已被弃用.

    ( gh-18697 )

移除已弃用的 PolyBase 和未使用的 PolyError 以及 PolyDomainError#

PolyBase 已被删除(在 numpy 1.9.0 中已弃用). 请改用抽象 ABCPolyBase 类.

此外,未使用的 PolyErrorPolyDomainError 异常已从 numpy.polynomial 中移除.

( gh-18963 )

兼容性说明#

通用函数中的错误类型更改#

在某些情况下,通用函数现在可能会在无效输入时引发不同的错误. 主要的变化应该是 RuntimeError 被更合适的 TypeError 替换. 当同一个调用中存在多个错误时,NumPy 现在可能会引发不同的错误.

( gh-15271 )

__array_ufunc__ 参数验证#

NumPy 现在将在调用 __array_ufunc__ 之前部分验证参数. 以前,当已知发生分派时,可以传递无效参数(例如不存在的关键字参数).

( gh-15271 )

__array_ufunc__ 和附加的位置参数#

以前,所有按位置传递的参数都会检查 __array_ufunc__ 支持. 在 reduce , accumulatereduceat 的情况下,所有参数都可以按位置传递. 这意味着当它们按位置传递时,它们之前可能已被要求通过 __array_ufunc__ 处理 ufunc 调用. 由于这取决于参数的传递方式(按位置或按关键字),NumPy 现在只会分派输入和输出数组. 例如,NumPy 永远不会在诸如 np.add.reduce 的归约中分派 where 数组.

( gh-15271 )

验证 Generator.uniform 中的输入值#

np.random.Generator.uniform 中检查了 high - low >= 0 .如果 low > high ,则引发 ValueError . 以前,无序输入被接受并静默交换,因此如果 low > high ,则生成的值为 high + (low - high) * random() .

( gh-17921 )

从默认包含路径中删除 /usr/include#

使用 numpy.distutils 构建包时,默认包含路径不再包含 /usr/include . 此路径通常由编译器添加,硬编码它可能会有问题. 如果这导致问题,请提出 issue.PR 18658 中记录了一个解决方法.

( gh-18658 )

dtype=... 的比较更改#

当比较ufunc( equal , less 等)的 dtype= (或 signature )参数被使用时,它将在未来表示所需的输出dtype. 这意味着:

np.equal(2, 3, dtype=object)

将给出 FutureWarning ,它将在未来返回一个 object 数组,这目前发生在:

np.equal(None, None, dtype=object)

这是由于 np.array(None) 已经是一个 object 数组.(对于其他一些dtypes也发生这种情况.)

由于比较通常只返回布尔数组,因此提供任何其他dtype将来总是会引发错误,现在会给出 DeprecationWarning .

( gh-18718 )

ufunc 中 dtypesignature 参数的更改#

通用函数参数 dtypesignature 对规约函数(例如 np.add.reduce ,它是 np.sum 的实现)也有效,当提供的 dtype 不是 “基本” dtype 时,现在会发出警告.

NumPy 几乎总是忽略元数据,字节序或这些输入的时单位.NumPy 现在将始终忽略它,如果字节序或时单位发生更改,则会引发错误.以下是将会引发错误的最重要的更改示例.在某些情况下,先前存储的信息未被忽略,在所有这些情况下,现在都会引发错误:

# Previously ignored the byte-order (affect if non-native)
np.add(3, 5, dtype=">i32")

# The biggest impact is for timedelta or datetimes:
arr = np.arange(10, dtype="m8[s]")
# The examples always ignored the time unit "ns":
np.add(arr, arr, dtype="m8[ns]")
np.maximum.reduce(arr, dtype="m8[ns]")

# The following previously did use "ns" (as opposed to `arr.dtype`)
np.add(3, 5, dtype="m8[ns]")  # Now return generic time units
np.maximum(arr, arr, dtype="m8[ns]")  # Now returns "s" (from `arr`)

这同样适用于像 np.sum 这样在内部使用它们的函数.此更改对于在 NumPy 中实现一致的处理是必要的.

如果您遇到这些情况,在大多数情况下,传递例如 dtype=np.timedelta64 将清楚地表示没有定义任何单元或字节顺序的通用 timedelta64 .如果您需要精确地指定输出 dtype,您可以选择强制转换输入或使用 out= 提供一个输出数组.

NumPy 可能会选择允许在这里提供一个精确的输出 dtype ,这将以 FutureWarning 作为先导.

( gh-18718 )

Ufunc signature=...dtype= 泛化和 casting#

由于 promotion 中的更改,与 1.20 相比, np.ufunc(1.0, 1.0, signature=...)np.ufunc(1.0, 1.0, dtype=...) 的行为现在可能会在 1.21 中产生不同的循环.当先前使用 signature 时,会放松对输入的 casting 检查,这可能会导致不安全地向下转换输入,尤其是在与 casting="unsafe" 结合使用时.

现在保证 casting 是安全的.如果仅部分提供签名,例如使用 signature=("float64", None, None) ,则可能导致找不到循环(错误).在这种情况下,必须提供完整的签名以强制转换输入.如果使用 dtype="float64" 或仅设置输出(例如, signature=(None, None, "float64") ),则不变.我们预计很少有用户会受到此更改的影响.

此外, dtype="float64" 的含义已略作修改,现在严格强制仅使用正确的输出(而不是输入)DType.这意味着它现在始终等效于:

signature=(None, None, "float64")

(如果 ufunc 有两个输入和一个输出).由于这可能会导致在某些情况下找不到循环,因此 NumPy 通常也会搜索该循环:

signature=("float64", "float64", "float64")

如果第一次搜索失败.将来,可以自定义此行为,以实现更复杂的 ufunc 的预期结果.(对于某些通用函数(例如 np.ldexp ),输入可以具有不同的 DType.)

( gh-18880 )

Distutils 强制 clang 使用严格的浮点模型#

现在,当使用 clang 编译时,NumPy distutils 将始终添加 -ffp-exception-behavior=strict 编译器标志.Clang 默认使用非严格版本,该版本允许编译器生成无法正确设置浮点警告/错误的代码.

( gh-19049 )

C API 更改#

使用 ufunc->type_resolver 和“类型元组”#

NumPy 现在会在调用类型解析器函数之前,将“类型元组”参数规范化. 请注意,使用此类型解析器是遗留行为,NumPy 将尽可能不这样做. 强烈建议不要调用 ufunc->type_resolverPyUFunc_DefaultTypeResolver ,如果这样做,现在将强制使用规范化的类型元组. 请注意,这不会影响提供类型解析器,预计它在大多数情况下都能正常工作. 如果您对调用类型解析器有意外的用例,请通知 NumPy 开发人员,以便找到解决方案.

( gh-18718 )

新特性#

添加了一个 mypy 插件来处理特定平台的 numpy.number 精度#

现在有一个 mypy 插件可用于自动分配某些 number 子类的(平台相关的)精度,包括 int_ , intplonglong 等.有关受影响类的全面概述,请参阅 scalar types 上的文档.

请注意,虽然插件的使用是完全可选的,但如果没有它,上述类的精度将被推断为 Any .

要启用插件,必须将其添加到 mypy configuration file :

[mypy]
plugins = numpy.typing.mypy_plugin

( gh-17843 )

让 mypy 插件管理扩展精度 numpy.number 子类#

numpy/numpy#17843 中引入的 mypy 插件已得到扩展:现在,该插件会删除不可用于相关平台的平台特定扩展精度类型的注释.例如,当 float128 不可用时,它将删除它.

如果没有该插件,就 mypy 而言,所有扩展精度类型都将在所有平台上可用.

要启用插件,必须将其添加到 mypy configuration file :

[mypy]
plugins = numpy.typing.mypy_plugin

( gh-18322 )

用于打印浮点数值的新 min_digits 参数#

一个新的 min_digits 参数已添加到 dragon4 浮点数打印函数 format_float_positionalformat_float_scientific . 此关键字参数保证在 unique=True 模式下打印时,至少打印给定数量的数字,即使额外的数字对于唯一指定值而言是不必要的. 它是 precision 参数的对应项,后者设置要打印的最大位数. 当 fixed precision 模式下 unique=False 时,它不起作用,并且 precision 参数固定了位数.

( gh-18629 )

f2py 现在可以识别 Fortran 抽象接口块#

f2py 现在可以解析抽象接口块.

( gh-18695 )

通过环境变量配置 BLAS 和 LAPACK#

可以通过使用 NPY_BLAS_LIBSNPY_LAPACK_LIBS 环境变量来绕过已安装的 BLAS 和 LAPACK 库的自动检测. 而是直接使用这些环境变量中的链接标志,并且假定语言为 F77. 这在自动构建中尤其有用,在自动构建中,可以准确知道已安装的 BLAS 和 LAPACK. 一个用例是在运行时通过存根库链接替换实际实现.

如果设置了 NPY_CBLAS_LIBS (除了 NPY_BLAS_LIBS 之外是可选的),也将使用它,方法是定义 HAVE_CBLAS 并将环境变量内容附加到链接标志.

( gh-18737 )

已为 ndarray 添加了一个运行时可下标的别名#

已添加 numpy.typing.NDArray ,它是 np.ndarray[Any, np.dtype[~Scalar]] 的运行时可下标别名. 新的类型别名可用于注释具有给定 dtype 和未指定形状的数组. 1

1 从 1.21 开始 NumPy 不支持注释数组形状,但这预计会在未来发生变化(参见 PEP 646 ).

例子#

>>> import numpy as np
>>> import numpy.typing as npt

>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[~ScalarType]]

>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]

>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)

>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
...     return np.array(a)

( gh-18935 )

改进#

numpy.unwrap 的任意 period 选项#

解包相位的间隔大小不再限制为 2 * pi . 这对于解包度数特别有用,但也可用于其他间隔.

>>> phase_deg = np.mod(np.linspace(0,720,19), 360) - 180
>>> phase_deg
array([-180., -140., -100.,  -60.,  -20.,   20.,   60.,  100.,  140.,
       -180., -140., -100.,  -60.,  -20.,   20.,   60.,  100.,  140.,
       -180.])

>>> unwrap(phase_deg, period=360)
array([-180., -140., -100.,  -60.,  -20.,   20.,   60.,  100.,  140.,
        180.,  220.,  260.,  300.,  340.,  380.,  420.,  460.,  500.,
        540.])

( gh-16987 )

np.unique 现在返回单个 NaN#

np.unique 操作于含有多个 NaN 条目的数组时,其返回值对于原始数组中每个 NaN 条目都包含一个 NaN .现在对此进行了改进,使得返回的数组仅包含一个 NaN 作为最后一个元素.

同样对于复数数组,所有 NaN 值都被认为是等价的(无论 NaN 是在实部还是虚部).作为返回数组的代表,选择字典序中最小的一个 - 有关复数数组的字典序定义,请参见 np.sort .

( gh-18070 )

Generator.rayleighGenerator.geometric 性能提升#

Generator 中瑞利分布和几何分布随机变量生成的性能得到了提升.它们都是指数随机变量的变换,并且基于慢速对数的逆累积分布函数变换已被基于 Ziggurat 的指数变量生成器所取代.

当生成来自这两个分布之一的变量时,此更改会破坏变量的流.

( gh-18666 )

占位符注解已得到改进#

所有先前被注解为 typing.Any 的占位符注解都已得到改进.在适当的情况下,它们已被显式函数定义,类或其他各种对象所取代.

( gh-18934 )

性能改进#

改进了 NumPy 数组的整数除法性能#

当除数是常数时,NumPy 数组的整数除法现在使用 libdivide .通过使用 libdivide 和其他小的优化,速度有了很大的提高. // 运算符和 np.floor_divide 利用了新的变化.

( gh-17727 )

提高小数组的 np.savenp.load 的性能#

对于小数组, np.save 现在快了很多.

对于小数组, np.load 也更快了,但仅在使用版本 >= (3, 0) 进行序列化时才如此.

这两者都是通过删除仅与 Python 2 相关的检查来完成的,同时仍然保持与可能由 Python 2 创建的数组的兼容性.

( gh-18657 )

变更#

numpy.piecewise 输出类现在与输入类匹配#

ndarray 子类用于 piecewise 的输入时,它们会传递给函数.输出现在也将是相同的子类.

( gh-18110 )

启用 Accelerate Framework#

随着 macOS 11.3 的发布,当使用 Accelerate Framework 实现的 BLAS 和 LAPACK 时,numpy 遇到的一些不同的问题应该得到解决.此更改启用了 macOS 上的 Accelerate Framework 选项.如果发现其他问题,请使用开发者反馈助手工具 (https://developer.apple.com/bug-reporting/) 提交针对 Accelerate 的错误报告.我们打算及时解决问题,并计划继续支持和更新我们的 BLAS 和 LAPACK 库.

( gh-18874 )