NumPy 1.24 发行说明#

NumPy 1.24.0 版本继续正在进行的工作,以改进数据类型的处理和升级、提高执行速度并澄清文档。由于促销和清理的变化,还有大量新的和过期的弃用。这可能称为弃用版本。亮点是

  • 许多新的弃用,检查一下。

  • 许多过期的弃用,

  • 新的 F2PY 功能和修复。

  • 用于堆叠函数的新“dtype”和“casting”关键字。

详情请参阅下文,

此版本支持 Python 版本 3.8-3.11。

弃用#

弃用 fastCopyAndTranspose 和 PyArray_CopyAndTranspose #

numpy.fastCopyAndTranspose函数已被弃用。直接使用对应的copy和transpose方法:

arr.T.copy()

PyArray_CopyAndTransposeNumPy C-API 中也已弃用底层 C 函数。

( gh-22313 )

出界 Python 整数的转换#

尝试从 Python 整数转换为 NumPy 值现在将始终检查结果是否可以由 NumPy 表示。这意味着以下示例将来会失败并给出DeprecationWarning现在:

np.uint8(-1)
np.array([3000], dtype=np.int8)

其中许多以前确实成功过。此类代码主要适用于具有负值的无符号整数,例如np.uint8(-1)给出 np.iinfo(np.uint8).max

请注意,NumPy 整数之间的转换不受影响,因此可以 np.array(-1).astype(np.uint8)继续工作并使用 C 整数溢出逻辑。对于负值,也可以查看数组: 。在某些情况下,使用or也可能效果很好。np.array(-1, dtype=np.int8).view(np.uint8)np.iinfo(np.uint8).maxval % 2**8

在极少数情况下,输入数据可能会混合负值和非常大的无符号值(即-12**63)。不幸的是,有必要%根据是否需要负值来使用 Python 值或使用有符号或无符号转换。

( gh-22385 )

弃用msort#

numpy.msort函数已被弃用。代替使用。np.sort(a, axis=0)

( gh-22456 )

np.str0和类似的现在已弃用#

以 0 位大小结尾的标量类型别名:np.object0np.str0np.bytes0np.void0np.int0np.uint0以及np.bool8 现已弃用,最终将被删除。

( gh-22607 )

已过期的弃用#

  • 关键字normed参数已从 np.histogramnp.histogram2dnp.histogramdd中删除。代替使用density。如果normed按位置传递,density现在使用。

    ( gh-21645 )

  • 不规则数组的创建现在将始终引发 aValueError除非 dtype=object通过。这包括非常深的嵌套序列。

    ( gh-22004 )

  • 已删除对 Visual Studio 2015 及更早版本的支持。

  • 已删除对 Windows Interix POSIX 互操作层的支持。

    ( gh-22139 )

  • 对 Cygwin < 3.3 的支持已被删除。

    ( gh-22159 )

  • mini() 方法np.ma.MaskedArray已被删除。使用 np.ma.MaskedArray.min()np.ma.minimum.reduce()

  • np.ma.minimumand的单参数形式np.ma.maximum已被删除。使用np.ma.minimum.reduce()np.ma.maximum.reduce() 代替。

    ( gh-22228 )

  • 将规范(主要是本机字节顺序)之外的 dtype 实例传递给 ufuncdtype=signature=在 ufunc 中传递现在将引发 TypeError.我们建议传递字符串"int8"或标量类型, np.int8因为字节顺序、日期时间/时间增量单位等从不强制执行。 (最初在 NumPy 1.21 中已弃用。)

    ( gh-22540 )

  • dtype=现在可以正确应用比较 ufuncs 的参数。这意味着只有boolobject是有效值并且dtype=object 是强制执行的。

    ( gh-22541 )

  • 别名np.objectnp.boolnp.floatnp.complexnp.str和的弃用np.int已过期(引入 NumPy 1.20)。其中一些现在除了引发错误之外还会给出 FutureWarning,因为它们将来会映射到 NumPy 标量。

    ( gh-22607 )

兼容性说明#

array.fill(scalar)行为可能略有不同#

numpy.ndarray.fill在某些情况下,由于逻辑与项目分配一致,现在的行为可能略有不同:

arr = np.array([1])  # with any dtype/value
arr.fill(scalar)
# is now identical to:
arr[0] = scalar

当使用无法在目标中表示的值dtype或当目标具有objectdtype 时,以前的转换可能会产生略有不同的答案。

( gh-20924 )

子数组到对象的转换现在复制#

现在,将包含子数组的数据类型转换为对象将确保子数组的副本。之前返回了不安全的视图:

arr = np.ones(3, dtype=[("f", "i", 3)])
subarray_fields = arr.astype(object)[0]
subarray = subarray_fields[0]  # "f" field

np.may_share_memory(subarray, arr)

现在总是假的。而以前对于特定演员来说确实如此。

( gh-21925 )

返回的数组尊重 dtype kwarg 对象的唯一性#

当关键字参数与or dtype一起使用时,返回数组的数据类型现在始终与调用者提供的数据类型完全匹配。np.arrayasarray

在某些情况下,此更改意味着返回视图而不是输入数组。以下是 64 位 Linux 上的示例,其中longlonglong的精度相同但不同dtypes

>>> arr = np.array([1, 2, 3], dtype="long")
>>> new_dtype = np.dtype("longlong")
>>> new = np.asarray(arr, dtype=new_dtype)
>>> new.dtype is new_dtype
True
>>> new is arr
False

更改之前,dtype不匹配,因为是 。new is arrTrue

( gh-21995 )

DLPack 导出引发BufferError#

当无法通过 DLPack 导出数组缓冲区时,BufferError现在总是在之前TypeErrorRuntimeError已引发的位置引发。这允许回退到缓冲区协议或__array_interface__首次尝试 DLPack 时。

( gh-22542 )

NumPy 版本不再在 GCC-6 上进行测试#

Ubuntu 18.04 已弃用 GitHub 操作,并且 GCC-6 在 Ubuntu 20.04 上不可用,因此不再测试使用该编译器的构建。我们仍然使用 GCC-7 和 GCC-8 来测试构建。

( gh-22598 )

新功能

symbol添加到多项式类的新属性#

包中的多项式类numpy.polynomial有一个新 symbol属性,用于表示多项式的不确定性。这可用于在打印时更改变量的值:

>>> P_y = np.polynomial.Polynomial([1, 0, -1], symbol="y")
>>> print(P_y)
1.0 + 0.0·y¹ - 1.0·y²

请注意,多项式类仅支持一维多项式,因此当结果是多元时,不允许涉及具有不同符号的多项式的运算:

>>> P = np.polynomial.Polynomial([1, -1])  # default symbol is "x"
>>> P_z = np.polynomial.Polynomial([1, 1], symbol="z")
>>> P * P_z
Traceback (most recent call last)
   ...
ValueError: Polynomial symbols differ

该符号可以是任何有效的 Python 标识符。默认值为symbol=x,与现有行为一致。

( gh-16154 )

F2PY 对 Fortrancharacter字符串的支持#

F2PY 现在支持使用以下方式包装 Fortran 函数:

  • 字符(例如)character x

  • 字符数组(例如)character, dimension(n) :: x

  • 字符串(例如)character(len=10) x

  • 和字符串数组(例如)character(len=10), dimension(n, m) :: x

参数,包括将 Python unicode 字符串作为 Fortran 字符串参数传递。

( gh-19388 )

新功能np.show_runtime#

除了显示构建相关信息之外,还添加了一个新功能numpy.show_runtime来显示机器的运行时信息。numpy.show_config

( gh-21468 )

strict选项testing.assert_array_equal#

strict选项现在可用于testing.assert_array_equal.设置strict=True将禁用标量的广播行为并确保输入数组具有相同的数据类型。

( gh-21595 )

新参数equal_nan添加到np.unique#

np.unique在 1.21 中进行了更改,将所有NaN值视为相等并返回单个NaN.设置equal_nan=False将恢复 1.21 之前的行为以视为NaNs唯一。默认为True.

( gh-21623 )

casting# 的dtype关键字参数numpy.stack

和关键字casting参数dtype现在可用于 numpy.stack.要使用它们,请编写.np.stack(..., dtype=None, casting='same_kind')

casting# 的dtype关键字参数numpy.vstack

和关键字casting参数dtype现在可用于 numpy.vstack.要使用它们,请编写.np.vstack(..., dtype=None, casting='same_kind')

casting# 的dtype关键字参数numpy.hstack

和关键字casting参数dtype现在可用于 numpy.hstack.要使用它们,请编写.np.hstack(..., dtype=None, casting='same_kind')

( gh-21627 )

单例 RandomState 底层的位生成器可以更改#

RandomState模块中公开的单例实例numpy.random在启动时使用位生成器进行初始化MT19937。新功能 set_bit_generator允许用用户提供的位生成器替换默认位生成器。引入此函数是为了提供一种方法,允许将新代码中的高质量现代位生成器与利用单例提供的随机变量生成函数的现有代码无缝集成。伴随函数get_bit_generator 返回 singleton 使用的当前位生成器RandomState。这样做是为了在需要时简化恢复原始随机源的过程。

生成可再现随机数的首选方法是在 的实例中使用现代位生成器Generator。该函数default_rng 简化了实例化:

>>> rg = np.random.default_rng(3728973198)
>>> rg.random()

然后可以与单例实例共享相同的位生成器,以便random模块中的调用函数将使用相同的位生成器:

>>> orig_bit_gen = np.random.get_bit_generator()
>>> np.random.set_bit_generator(rg.bit_generator)
>>> np.random.normal()

交换是永久性的(直到反转),因此对 random模块中函数的任何调用都将使用新的位生成器。如果需要代码正确运行,可以恢复原始版本:

>>> np.random.set_bit_generator(orig_bit_gen)

( gh-21976 )

np.void现在有一个dtype争论#

NumPy 现在允许通过将参数传递dtype给 来直接构造结构化 void 标量np.void

( gh-22316 )

改进#

F2PY 改进#

  • 生成的扩展模块不再使用已弃用的 NumPy-C API

  • 改进了f2py生成的异常消息

  • 许多错误和flake8警告修复

  • 可以在签名文件的 C 表达式中使用的各种 CPP 宏都以f2py_.例如,应该使用f2py_len(x) 而不是len(x)

  • 引入了一种新的构造来支持从包装函数character(f2py_len=...)返回假定长度的字符串(例如)character(len=*)

引入了一个钩子,支持f2py在读取所有输入文件后重写内部数据结构。例如,对于 SciPy 支持的 BC,这是必需的,其中字符参数被视为 C表达式中的字符串参数。

( gh-19388 )

IBM zSystems 矢量扩展工具 (SIMD) #

通过通用内在函数接口添加了对 zSystem(z13、z14、z15)的 SIMD 扩展的支持。此支持可提高使用通用内在函数实现的所有 SIMD 内核的性能,包括以下操作:rint、floor、trunc、ceil、sqrt、absolute、square、reciprocal、tanh、sin、cos、equal、not_equal、greater、greater_equal 、 less、 less_equal、 最大值、 最小值、 fmax、 fmin、 argmax、 argmin、 加、减、乘、除。

( gh-20913 )

NumPy 现在在转换中给出浮点错误#

在大多数情况下,NumPy 以前在转换过程中发生这些情况时不会给出浮点警告或错误。例如,强制转换如下:

np.array([2e300]).astype(np.float32)  # overflow for float32
np.array([np.inf]).astype(np.int64)

现在通常应该给出浮点警告。这些警告应该警告发生了浮点溢出。对于将浮点值转换为整数时出现的错误,用户应该收到无效值警告。

用户可以使用 修改这些警告的行为np.errstate

请注意,对于 float 到 int 的转换,给出的确切警告可能取决于平台。例如:

arr = np.full(100, fill_value=1000, dtype=np.float64)
arr.astype(np.int8)

可能给出的结果相当于(中间强制转换意味着没有给出警告):

arr.astype(np.int64).astype(np.int8)

可能会返回未定义的结果,并设置警告:

RuntimeWarning: invalid value encountered in cast

精确的行为取决于 C99 标准及其在软件和硬件中的实现。

( gh-21437 )

F2PY支持value属性#

Fortran 标准要求使用value 属性声明的变量必须按值而不是引用传递。 F2PY 现在正确支持这种使用模式。因此,在 Fortran 代码中将生成正确的包装器。integer, intent(in), value :: x

( gh-21807 )

添加了对第三方 BitGenerators 的 pickle 支持#

位生成器的 pickle 格式经过扩展,允许每个位生成器在 pickling 期间提供自己的构造函数。以前版本的 NumPy 仅支持Generator使用 NumPy 提供的核心位生成器集之一创建的 unpickle 实例。尝试取消 Generator使用第三方位生成器的 a 将会失败,因为取消期间使用的构造函数只知道 NumPy 中包含的位生成器。

( gh-22014 )

arange() 现在显式失败并显示 dtype=str #

以前,该函数适用于和 ,但会针对 的其他值引发非特定异常消息 。现在,它会引发TypeError,通知不支持字符串数据类型:np.arange(n, dtype=str)n=1n=2narange

>>> np.arange(2, dtype=str)
Traceback (most recent call last)
   ...
TypeError: arange() not supported for inputs with DType <class 'numpy.dtype[str_]'>.

( gh-22055 )

numpy.typing协议现在可以运行时检查#

中使用的协议numpy.typing.ArrayLike现在numpy.typing.DTypeLike 已正确标记为运行时可检查,使它们更易于运行时类型检查器使用。

( gh-22357 )

性能改进和变化#

整数数组np.isin和的更快版本#np.in1d

np.in1d(由 所使用np.isin)现在可以在传递两个整数数组时切换到更快的算法(速度高达 >10 倍)。这通常是自动使用的,但您可以分别使用kind="sort"kind="table"强制使用旧方法或新方法。

( gh-12065 )

更快的比较运算符#

比较函数(numpy.equalnumpy.not_equalnumpy.lessnumpy.less_equal和)现在速度更快numpy.greaternumpy.greater_equal因为它们现在使用通用内在函数进行矢量化。对于具有 SIMD 扩展 AVX512BW 的 CPU,对于整数、浮点和布尔数据类型(N=50000),性能增益分别高达 2.57 倍、1.65 倍和 19.15 倍。

( gh-21483 )

变化

更好地报告整数除法溢出#

用于提供 a 的标量和数组的整数除法溢出 RuntimeWarning且返回值未定义,导致极少数情况下崩溃:

>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: divide by zero encountered in floor_divide
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)

整数除法溢出现在返回输入数据类型的最小值并引发以下结果RuntimeWarning

>>> np.array([np.iinfo(np.int32).min]*10, dtype=np.int32) // np.int32(-1)
<stdin>:1: RuntimeWarning: overflow encountered in floor_divide
array([-2147483648, -2147483648, -2147483648, -2147483648, -2147483648,
       -2147483648, -2147483648, -2147483648, -2147483648, -2147483648],
      dtype=int32)

( gh-21506 )

masked_invalid现在就地修改掩码#

当与 一起使用时copy=Falsenumpy.ma.masked_invalid现在会就地修改输入掩码数组。这使得它的行为与文档相同 masked_where并且更好地匹配文档。

( gh-22046 )

nditer/NpyIter允许分配所有操作数#

np.nditerPython 和C 中提供的 NumPy 迭代器NpyIter 现在支持分配所有数组。() 在这种情况下,迭代器形状默认为。必须提供操作数 dtype,因为无法从其他输入推断出“通用 dtype”。

( gh-22457 )