NumPy 1.20.0 Release Notes#

本次 NumPy 发布是迄今为止最大的一次,合并了 184 位贡献者提交的约 684 个 PR。更多细节请参阅以下亮点列表。本次发布支持的 Python 版本为 3.7-3.9,已移除对 Python 3.6 的支持。亮点如下:

  • 为 NumPy 函数添加了注解。此项工作仍在进行中,期待从用户反馈中获得改进。

  • 更广泛地使用 SIMD 以提高 ufuncs 的执行速度。在引入通用函数方面做了大量工作,这些函数将有助于在不同硬件平台上更轻松地使用现代功能。此项工作仍在进行中。

  • 初步改变 dtype 和 casting 的实现,以便为扩展 dtype 提供更简单的路径。此项工作仍在进行中,但已完成足够的工作以允许实验和反馈。

  • 大量的文档改进,包括约 185 个 PR 的合并。此项工作仍在进行中,是改进 NumPy 在线存在和对新用户实用性的更大项目的一部分。

  • 进一步清理与移除 Python 2.7 相关的工作。这提高了代码的可读性并消除了技术债务。

  • 对即将发布的 Cython 3.0 的初步支持。

新增函数#

random.Generator 类新增了一个 permuted 函数。#

新函数与 shufflepermutation 的不同之处在于,它会排列由一个轴索引的子数组,而不是将该轴视为所有其他索引组合的独立一维数组。例如,现在可以排列二维数组的行或列。

(gh-15121)

sliding_window_view 为 numpy 数组提供了滑动窗口视图。#

numpy.lib.stride_tricks.sliding_window_view 构建了 numpy 数组的视图,这些视图提供了对数组的滑动或移动窗口访问。这允许简单地实现某些算法,例如移动平均。

(gh-17394)

numpy.broadcast_shapes 是一个新用户可见的函数。#

broadcast_shapes 获取将给定的形状元组相互广播后的结果形状。

>>> np.broadcast_shapes((1, 2), (3, 1))
(3, 2)

>>> np.broadcast_shapes(2, (3, 1))
(3, 2)

>>> np.broadcast_shapes((6, 7), (5, 6, 1), (7,), (5, 1, 7))
(5, 6, 7)

(gh-17535)

弃用#

使用像 np.int 这样的内置类型别名已被弃用。#

长期以来,np.int 一直是内置 int 的别名。这反复给新用户造成困惑,主要是出于历史原因而存在。

这些别名已被弃用。下表列出了所有已弃用的别名及其确切含义。将第一列中的项替换为第二列中的内容将产生相同的效果并消除弃用警告。

第三列列出了 NumPy 的替代名称,有时可能更可取。有关更多详细信息,请参见 数据类型

已弃用的名称

等同于

NumPy 标量类型名称

numpy.bool

bool

numpy.bool_

numpy.int

int

numpy.int_ (默认), numpy.int64, 或 numpy.int32

numpy.float

float

numpy.float64, numpy.float_, numpy.double (等同)

numpy.complex

complex

numpy.complex128, numpy.complex_, numpy.cdouble (等同)

numpy.object

object

numpy.object_

numpy.str

str

numpy.str_

numpy.long

int

numpy.int_ (C long), numpy.longlong (最大的整数类型)

numpy.unicode

str

numpy.unicode_

为了给绝大多数情况提供清晰的指导,对于 bool, object, str (和 unicode) 类型,使用不带下划线的版本更简洁明了,通常是很好的替代。对于 floatcomplex,如果你想更明确地指定精度,可以使用 float64complex128

对于 np.int,直接替换为 np.int_int 也可以,并且不会改变行为,但精度将继续取决于计算机和操作系统。如果你想更明确并审查当前的使用情况,你有以下选择:

  • np.int64np.int32 来精确指定精度。这确保了结果不会依赖于计算机或操作系统。

  • np.int_int (默认),但要注意它依赖于计算机和操作系统。

  • C 类型:np.cint (int), np.int_ (long), np.longlong

  • np.intp,它在 32 位机器上是 32 位,在 64 位机器上是 64 位。这可能是用于索引的最佳类型。

当与 np.dtype(...)dtype=... 一起使用时,更改为上述 NumPy 名称不会影响输出。如果作为标量与

np.float(123)

进行更改可能会微妙地改变结果。在这种情况下,Python 版本 float(123)int(12.) 通常更可取,尽管 NumPy 版本可能有助于与 NumPy 数组保持一致(例如,NumPy 对除以零等操作的行为不同)。

(gh-14882)

向具有非可选 shape 参数的函数传递 shape=None 已弃用。#

以前,这相当于传递 shape=()。此弃用由 C API 中的 PyArray_IntpConverter 发出。如果你的 API 旨在支持传递 None,那么你应该在调用转换器之前检查 None,以便区分 None()

(gh-15886)

即使索引结果为空,也将报告索引错误。#

将来,即使非索引维度的长度为 0,当整数数组索引包含越界值时,NumPy 也会抛出 IndexError。现在将发出 DeprecationWarning。这可能发生在数组先前为空,或涉及空切片时。

arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]

以前,非空索引 [20] 未进行正确性检查。现在将对其进行检查,从而发出弃用警告,该警告将转换为错误。这也适用于赋值。

(gh-15900)

modesearchside 的不精确匹配已被弃用。#

modesearchside 的不精确且不区分大小写的匹配之前是有效的输入,现在将发出 DeprecationWarning。例如,以下是一些现在已弃用并将发出 DeprecationWarning 的示例用法:

import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap")  # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random')  # should be "right"

(gh-16056)

弃用 numpy.dual#

模块 numpy.dual 已被弃用。应直接从 NumPy 或 SciPy 导入函数,而不是从 numpy.dual 导入。

(gh-16156)

outerufunc.outer 对矩阵已弃用。#

outer 或通用 ufunc outer 调用(如 numpy.add.outer)中使用 np.matrix。以前,矩阵会在此处转换为数组。将来不会这样做,需要手动转换为数组。

(gh-16232)

进一步弃用数字样式类型。#

其余的数字样式类型代码 Bytes0Str0Uint32Uint64Datetime64 已被弃用。应使用小写变体。对于字节和字符串,"S""U" 是进一步的替代选项。

(gh-16554)

ndindexndincr 方法已被弃用。#

自 NumPy 1.8 起,文档就警告不要使用此函数。请使用 next(it) 而不是 it.ndincr()

(gh-17233)

未定义 __len____getitem__ 的 ArrayLike 对象。#

定义了 __array____array_interface____array_struct__ 协议但不是序列(通常通过具有 __len____getitem__ 定义)的对象,将来在数组强制转换期间的行为将有所不同。

当嵌套在序列中时,例如 np.array([array_like]),这些会被当作一个单独的 Python 对象处理,而不是一个数组。将来,它们的行为将与

np.array([np.array(array_like)])

此更改只应在 np.array(array_like) 不是 0-D 时产生影响。此警告的解决方案可能取决于对象。

  • 一些 array-likes 可能期望新的行为,用户可以忽略此警告。对象可以选择公开序列协议以选择加入新行为。

  • 例如,shapely 将允许使用 line.coords 而不是 np.asarray(line) 进行数组转换。用户可以解决此警告,或在新行为可用时使用新约定。

不幸的是,使用新行为只能通过调用 np.array(array_like) 来实现。

如果您希望旧行为保持不变,请创建一个对象数组然后显式填充它,例如:

arr = np.empty(3, dtype=object)
arr[:] = [array_like1, array_like2, array_like3]

这将确保 NumPy 知道不进入 array-like 并将其用作对象。

(gh-17973)

未来变化#

数组不能使用子数组 dtype。#

使用 np.array(arr, dtype)arr.astype(dtype) 创建和强制转换数组时,当 dtype 是子数组 dtype(如 np.dtype("(2)i,"))时,其逻辑将不同。

对于这样的 dtype,以下行为是真实的:

res = np.array(arr, dtype)

res.dtype is not dtype
res.dtype is dtype.base
res.shape == arr.shape + dtype.shape

但是 res 使用以下逻辑填充:

res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
res[...] = arr

这会使用错误的广播(通常会导致错误)。将来,这将改为单独强制转换每个元素,从而产生与以下相同的效果:

res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]

这通常可以用来选择加入新行为。

此更改不影响 np.array(list, dtype="(2)i,"),除非 list 本身至少包含一个数组。特别是,对于元组列表,行为保持不变。

(gh-17596)

已过期的弃用#

  • 数字样式类型代码 np.dtype("Complex64")(大写拼写)的弃用已过期。"Complex64" 对应于 "complex128",而 "Complex32" 对应于 "complex64"

  • np.sctypeNAnp.typeNA 的弃用已过期。两者都已从公共 API 中移除。请使用 np.typeDict 代替。

    (gh-16554)

  • np.ctypeslib.ctypes_load_library 的 14 年弃用已过期。请使用 load_library 代替,后者是相同的。

    (gh-17116)

金融函数已移除。#

根据 NEP 32,金融函数已从 NumPy 1.20 中移除。已移除的函数是 fvipmtirrmirrnpernpvpmtppmtpvrate。这些函数可在 numpy_financial 库中使用。

(gh-17067)

兼容性说明#

isinstance(dtype, np.dtype) 而不是 type(dtype) is not np.dtype#

NumPy dtypes 不再是 np.dtype 的直接实例。使用 type(dtype) is np.dtype 的代码将始终返回 False,必须更新为使用正确的版本 isinstance(dtype, np.dtype)

此更改也影响 C 端的宏 PyArray_DescrCheck(如果针对 NumPy 1.16.6 之前的版本编译)。如果代码使用此宏并希望针对旧版本的 NumPy 进行编译,则必须替换该宏(另请参阅 C API changes 部分)。

axis=None 的 concatenate 中的同类强制转换。#

当使用 axis=None 调用 concatenate 时,展平的数组会使用 unsafe 进行强制转换。任何其他轴选择都使用“same kind”。这种不同的默认值已被弃用,并且将改用“same kind”强制转换。新的 casting 关键字参数可用于保留旧行为。

(gh-16134)

NumPy 标量在分配给数组时会被强制转换。#

在创建或分配给数组时,在所有相关情况下,NumPy 标量现在将与 NumPy 数组进行相同的强制转换。特别是,这会改变先前会引发错误的某些情况下的行为:

np.array([np.float64(np.nan)], dtype=np.int64)

将成功并返回一个未定义的结果(通常是可能的最小整数)。这也影响赋值:

arr[0] = np.float64(np.nan)

此时,NumPy 保留了以下情况的行为:

np.array(np.float64(np.nan), dtype=np.int64)

上述更改不影响 Python 标量:

np.array([float("NaN")], dtype=np.int64)

不受影响(np.nan 是 Python float,而不是 NumPy 的)。与有符号整数不同,无符号整数不保留此特殊情况,因为它们始终更像强制转换。以下代码不再引发错误:

np.array([np.float64(np.nan)], dtype=np.uint64)

为避免向后兼容性问题,此时从 datetime64 标量到长度不足的字符串的赋值仍然受支持。这意味着 np.asarray(np.datetime64("2020-10-10"), dtype="S5") 现在成功,而以前失败。从长远来看,这可能会被弃用,或者不安全的强制转换可能会被普遍允许,以使数组和标量的赋值行为一致。

字符串和其他类型混合时的数组强制转换更改。#

当字符串和其他类型混合时,例如:

np.array(["string", np.float64(3.)], dtype="S")

结果将发生变化,这可能导致在某些情况下字符串 dtype 包含更长的字符串。特别地,如果未为 dtype="S" 提供任何数值,则任何数值都将导致一个足够长的字符串结果来容纳所有可能的数值(例如,浮点数的“S32”)。请注意,在将非字符串转换为字符串时,应始终提供 dtype="S"

如果提供了 dtype="S",结果将与以前大致相同,但 NumPy 标量(而不是 Python 浮点数,如 1.0)仍将强制执行统一的字符串长度:

np.array([np.float64(3.)], dtype="S")  # gives "S32"
np.array([3.0], dtype="S")  # gives "S3"

以前,第一种情况的结果与第二种相同。

数组强制转换重构。#

数组强制转换已重构。总的来说,这不应影响用户。在极其罕见的角落情况下,当 array-likes 嵌套时:

np.array([array_like1])

现在将与以下更加一致:

np.array([np.array(array_like1)])

这可能会对某些定义不佳的 array-likes 产生细微的输出差异。一个例子是 array-like 对象本身不是序列(定义 __getitem____len__),但在 NumPy 1.20 中,当 array-like 不是序列时(行为保持不变,请参阅弃用),将发出警告。如果 array-like 也是序列,NumPy 现在将仅使用 __array____array_interface____array_struct__ 给出的结果。当(嵌套的)序列描述了不同的形状时,这将导致差异。

(gh-16200)

写入 numpy.broadcast_arrays 的结果将导出只读缓冲区。#

在 NumPy 1.17 中,当写入 numpy.broadcast_arrays 的结果数组时,开始发出警告。当通过缓冲区接口(例如 memoryview(arr))使用数组时,会跳过此警告。对于 __array_interface____array_struct__ 这两个协议,现在将发生同样的情况,它们将返回只读缓冲区而不是发出警告。

(gh-16350)

数字样式的类型名称已从类型字典中移除。#

为了与 np.dtype("Complex64") 和其他数字样式的(大写)类型保持同步。这些已从 np.sctypeDictnp.typeDict 中移除。您应该使用小写版本。请注意,"Complex64" 对应于 "complex128",而 "Complex32" 对应于 "complex64"。NumPy 样式(新)版本表示完整大小,而不是实部/虚部的大小。

(gh-16554)

operator.concat 函数现在对数组参数引发 TypeError。#

以前的行为是回退到加法并添加两个数组,这被认为是连接函数的一个意外行为。

(gh-16570)

ABCPolyBase 中的 nickname 属性已移除。#

抽象属性 nickname 已从 ABCPolyBase 中移除,因为它在派生方便类中已不再使用。这可能会影响从 ABCPolyBase 派生类并覆盖表示和显示方法的用户,例如 __str____repr___repr_latex 等。

(gh-16589)

float->timedeltauint64->timedelta 提升将引发 TypeError。#

浮点数和 timedelta 提升一致地引发 TypeError。np.promote_types("float32", "m8") 现在与 np.promote_types("m8", "float32") 对齐,并且两者都引发 TypeError。以前,np.promote_types("float32", "m8") 返回 "m8",这被认为是一个 bug。

Uint64 和 timedelta 提升一致地引发 TypeError。np.promote_types("uint64", "m8") 现在与 np.promote_types("m8", "uint64") 对齐,并且两者都引发 TypeError。以前,np.promote_types("uint64", "m8") 返回 "m8",这被认为是一个 bug。

(gh-16592)

numpy.genfromtxt 现在可以正确解包结构化数组。#

以前,如果 unpack=True 被调用并且结构化数据类型被传递给 dtype 参数(或传递 dtype=None 并推断出结构化数据类型),numpy.genfromtxt 无法解包。例如:

>>> data = StringIO("21 58.0\n35 72.0")
>>> np.genfromtxt(data, dtype=None, unpack=True)
array([(21, 58.), (35, 72.)], dtype=[('f0', '<i8'), ('f1', '<f8')])

结构化数组现在将正确解包为数组列表,每个数组对应一列。

>>> np.genfromtxt(data, dtype=None, unpack=True)
[array([21, 35]), array([58., 72.])]

(gh-16650)

mgridr_ 等对于非默认精度输入始终返回正确输出。#

先前,np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]np.r_[0:10:np.complex64(3j)] 未能返回有意义的输出。此 bug 可能会影响 mgridogridr_c_,当输入的数据类型不是默认的 float64complex128 以及等效的 Python 类型时。这些方法已得到修复,可以正确处理各种精度。

(gh-16815)

形状不匹配的布尔数组索引现在将正确地引发 IndexError#

以前,如果布尔数组索引的大小与被索引数组的大小匹配但不匹配形状,在某些情况下会被错误地允许。在其他情况下,它会引发一个错误,但错误错误地是一个 ValueError,带有关于广播的消息,而不是正确的 IndexError

例如,以下代码以前会错误地给出 ValueError: operands could not be broadcast together with shapes (2,2) (1,4)

np.empty((2, 2))[np.array([[True, False, False, False]])]

以下代码以前会错误地返回 array([], dtype=float64)

np.empty((2, 2))[np.array([[False, False, False, False]])]

现在两者都将正确地给出 IndexError: boolean index did not match indexed array along dimension 0; dimension is 2 but corresponding boolean dimension is 1

(gh-17010)

类型转换错误会中断迭代#

在迭代过程中进行类型转换时,错误可能会比以前更早地停止迭代。无论如何,失败的类型转换操作总是返回未定义的部分结果。这些结果现在可能更加未定义和不完整。对于 NpyIter C-API 的用户来说,此类类型转换错误现在将导致 iternext() 函数返回 0,从而中止迭代。目前,没有 API 可以直接检测到此类错误。有必要检查 PyErr_Occurred(),这可能与 NpyIter_Reset 结合使用时存在问题。这些问题一直存在,但如果用户需要,可以添加新的 API。

(gh-17029)

f2py 生成的代码可能返回 unicode 而非字节字符串#

f2py 生成的一些以前返回的字节字符串现在可能是 unicode 字符串。这是由于正在进行的 Python2 -> Python3 清理工作的结果。

(gh-17068)

__array_interface__["data"] 元组的第一个元素必须是整数#

这已经是文档中记载的接口多年了,但仍有一些代码会接受指针地址的字节字符串表示。该代码已被删除,现在将指针地址作为字节字符串传递将引发错误。

(gh-17241)

poly1d 尊重全零参数的 dtype#

以前,使用全零系数构建 poly1d 的实例会将系数转换为 np.float64。这会影响内部构建 poly1d 实例的方法的输出 dtype,例如 np.polymul

(gh-17577)

用于 swig 的 numpy.i 文件仅支持 Python 3。#

Python 2.7 C-API 函数的使用已更新为仅支持 Python 3。需要旧版本的用户应从旧版本的 NumPy 中获取。

(gh-17580)

np.array 中的 void dtype 发现#

在调用 np.array(..., dtype="V")arr.astype("V") 和类似函数时,除非所有元素的 void 长度都相同,否则现在将正确地引发 TypeError。例如:

np.array([b"1", b"12"], dtype="V")

以前返回一个 dtype 为 "V2" 的数组,该数组无法忠实地表示 b"1"

(gh-17706)

C API 更改#

PyArray_DescrCheck 宏已修改#

自 NumPy 1.16.6 起,PyArray_DescrCheck 宏已更新为

#define PyArray_DescrCheck(op) PyObject_TypeCheck(op, &PyArrayDescr_Type)

从 NumPy 1.20 开始,针对早期版本编译的代码将与 NumPy 1.20 不兼容。解决方法是:要么针对 1.16.6 进行编译(如果您希望支持的最旧版本是 NumPy 1.16),要么手动内联宏,将其替换为新定义

PyObject_TypeCheck(op, &PyArrayDescr_Type)

与所有 NumPy 版本兼容。

np.ndarraynp.void_ 的大小已更改#

PyArrayObjectPyVoidScalarObject 结构的大小已更改。以下头文件定义已被删除

#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))

因为大小不应被视为编译时常量:它将因 NumPy 运行时版本的不同而变化。

最有可能相关的用途是潜在的 C 语言子类,它们将需要重新编译并进行更新。请参阅 PyArrayObject 的文档了解更多详情,并在您受此更改影响时联系 NumPy 开发人员。

NumPy 将尝试提供一个优雅的错误,但期望固定结构大小的程序可能会出现未定义的行为,并且很可能会崩溃。

(gh-16938)

新功能#

numpy.allnumpy.any 函数的 where 关键字参数#

添加了 where 关键字参数,该参数允许仅考虑布尔求值中数组的指定元素或子轴 allany。此新关键字可通过 numpy 直接访问,也可通过 numpy.ndarray 的方法访问。

任何可广播的布尔数组或标量都可以设置为 where。如果用户未设置 where,则默认为 True,以便对数组中的所有元素求值。函数的文档中提供了示例。

numpy 函数 meanstdvarwhere 关键字参数#

添加了 where 关键字参数,该参数允许在计算 meanstdvar 时将范围限制在仅一部分元素。它可通过 numpy 直接访问,也可通过 numpy.ndarray 的方法访问。

任何可广播的布尔数组或标量都可以设置为 where。如果用户未设置 where,则默认为 True,以便对数组中的所有元素求值。函数的文档中提供了示例。

(gh-15852)

numpy.fft 函数的 norm=backwardforward 关键字选项#

添加了关键字参数选项 norm=backward,作为 None 的别名,并作为默认选项;使用它时,直接变换未缩放,逆变换按 1/n 缩放。

使用新的关键字参数选项 norm=forward 时,直接变换按 1/n 缩放,逆变换未缩放(即与默认选项 norm=backward 完全相反)。

(gh-16476)

NumPy 现在是类型化的#

已为 NumPy 的大部分内容添加了类型注解。还有一个新的 numpy.typing 模块,其中包含对最终用户有用的类型。当前可用的类型有:

  • ArrayLike:用于可强制转换为数组的对象

  • DtypeLike:用于可强制转换为 dtype 的对象

(gh-16515)

numpy.typing 在运行时可访问#

numpy.typing 中的类型现在可以在运行时导入。类似以下的代码现在可以工作:

from numpy.typing import ArrayLike
x: ArrayLike = [1, 2, 3, 4]

(gh-16558)

f2py 生成的模块的新 __f2py_numpy_version__ 属性。#

由于 f2py 与 NumPy 一起发布,__f2py_numpy_version__ 提供了一种跟踪 f2py 用于生成模块的版本的方法。

(gh-16594)

可以通过 runtests.py 运行 mypy 测试#

目前,使用配置好的 NumPy 存根运行 mypy 需要

  • 安装 NumPy

  • 将源目录添加到 MYPYPATH 并链接到 mypy.ini

这两种选项都有些不方便,因此为 runtests 添加了一个 --mypy 选项,该选项会为您处理设置。这在将来对于任何类型代码生成也将是有用的,因为它将确保在类型检查之前构建项目。

(gh-17123)

用户定义的 BLAS/LAPACK 检测顺序的否定#

distutils 允许在确定 BLAS/LAPACK 库时否定库。这可以用来从库解析阶段中移除一个项,即通过执行以下操作来禁止 NetLIB 库:

NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build

这将使用任何加速库而不是它们。

(gh-17219)

允许将优化参数传递给 asv build#

现在可以在使用 --bench-compare 参数时将 -j--cpu-baseline--cpu-dispatch--disable-optimization 标志传递给 ASV build。

(gh-17284)

现在支持 NVIDIA HPC SDK nvfortran 编译器#

已添加对 nvfortran 编译器(pgfortran 的一个版本)的支持。

(gh-17344)

covcorrcoefdtype 选项#

现在 numpy.covnumpy.corrcoef 可用 dtype 选项。它指定返回结果应具有的数据类型。默认情况下,这些函数仍返回 numpy.float64 结果。

(gh-17456)

改进#

多项式的字符串表示(__str__)已改进#

numpy.polynomial 中所有六种多项式类型的字符串表示(__str__)已更新,以将多项式显示为数学表达式而不是系数数组。多项式表达式有两种全局可用的格式 - 一种使用 Unicode 字符表示上标和下标,另一种仅使用 ASCII 字符。

(gh-15666)

将 Accelerate 库从候选 LAPACK 库中移除#

Apple 不再支持 Accelerate。将其移除。

(gh-15759)

包含多行对象的对象数组具有更易读的 repr#

如果对象数组的元素具有包含换行符的 repr,则换行行将按列对齐。特别是,这改进了嵌套数组的 repr

>>> np.array([np.eye(2), np.eye(3)], dtype=object)
array([array([[1., 0.],
              [0., 1.]]),
       array([[1., 0., 0.],
              [0., 1., 0.],
              [0., 0., 1.]])], dtype=object)

(gh-15997)

Concatenate 支持提供输出 dtype#

已向 concatenate 添加了支持,以使用关键字参数提供输出 dtypecasting。不能与 out 参数一起提供 dtype 参数。

(gh-16134)

f2py 回调函数的线程安全#

f2py 中的回调函数现在是线程安全的。

(gh-16519)

numpy.core.records.fromfile 现在支持文件对象#

numpy.core.records.fromfile 现在可以使用文件对象,例如 io.BytesIO

(gh-16675)

distutils 添加了 AIX 上的 RPATH 支持#

这使得 SciPy 可以在 AIX 上构建。

(gh-16710)

使用命令行参数指定的 f90 编译器#

Fortran Portland Group Compiler 的编译器命令选择在 numpy.distutils.fcompiler 中已更改。这仅影响链接命令。这会强制使用命令行选项(如果提供)提供的可执行文件,而不是 pgfortran 可执行文件。如果未向命令行选项提供可执行文件,则根据 PGI 文档,它默认为 pgf90 可执行文件,它是 pgfortran 的别名。

(gh-16730)

为 Cython 3.0 及更高版本添加 NumPy 声明#

Cython 3.0 的 pxd 声明已得到改进,以避免使用已弃用的 NumPy C-API 功能。使用 Cython 3.0+ 并使用 NumPy 构建的扩展模块现在可以设置 C 宏 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION,以避免有关已弃用 API 用法的 C 编译器警告。

(gh-16986)

使窗口函数完全对称#

确保 NumPy 提供的窗口函数是对称的。由于计算的排列方式得到了改善,以前由于数值精度而产生的微小对称偏差现在已得到避免。

(gh-17195)

性能改进和更改#

启用多平台 SIMD 编译器优化#

一系列 NumPy 基础设施的改进,为 **NEP-38** 铺平了道路,总结如下:

  • 新的构建参数

    • --cpu-baseline 指定必需的最少优化集,默认值为 min,它提供可以在广大用户平台上安全运行的最少 CPU 功能。

    • --cpu-dispatch 指定附加优化的分派集,默认值为 max -xop -fma4,它启用所有 CPU 功能,但 AMD 遗留功能除外。

    • --disable-optimization 明确禁用所有新的改进,它还添加了一个新的 **C** 编译器 #定义,称为 NPY_DISABLE_OPTIMIZATION,可用于保护任何 SIMD 代码。

  • 高级 CPU 分派器

    一个灵活的跨架构 CPU 分派器,建立在 Python/Numpy distutils 之上,支持所有通用编译器和广泛的 CPU 功能。

    新的分派器需要一个特殊的文件扩展名 *.dispatch.c 来标记可分派的 **C** 源文件。这些源文件可以多次编译,以便每次编译过程代表特定的 CPU 功能,并提供影响代码路径的不同 #定义和标志。

  • 新的自动生成 C 头文件 ``core/src/common/_cpu_dispatch.h``

    此头文件由 distutils 模块 ccompiler_opt 生成,并包含通过命令行参数 ‘–cpu-baseline’ 和 ‘–cpu-dispatch’ 配置的所有 #定义和指令集头文件。

  • 新的 C 头文件 ``core/src/common/npy_cpu_dispatch.h``

    此头文件包含整个 CPU 分派过程所需的所有实用程序,它还可以被视为连接新基础设施工作与 NumPy CPU 运行时检测的桥梁。

  • 向 NumPy umath 模块(Python 级别)添加新属性

    • __cpu_baseline__:一个列表,包含根据命令行参数 ‘–cpu-baseline’ 的指定值,编译器和平台支持的最少优化集。

    • __cpu_dispatch__:一个列表,包含根据命令行参数 ‘–cpu-dispatch’ 的指定值,编译器和平台支持的分派附加优化集。

  • 在 PytestTester 运行时打印支持的 CPU 功能

(gh-13516)

更改#

np.linspace 对整数现在使用 floor#

在使用 numpy.linspaceint dtype 时,以前浮点数值会向零取整。现在使用 numpy.floor 代替,它会向 -inf 取整。这会改变负值的結果。例如,以下内容以前会给出

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

现在结果为

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1,  0,  1])

以前的结果仍然可以通过以下方式获得:

>>> np.linspace(-3, 1, 8).astype(int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

(gh-16841)