NumPy 1.23.0 发布说明#
NumPy 1.23.0 版本的发布延续了改进 dtype 处理和提升、提高执行速度、澄清文档以及淘汰旧有废弃功能的工作。主要亮点包括:
- loadtxt用 C 语言实现,大幅提升了其性能。
- 在 Python 级别暴露 DLPack,便于数据交换。 
- 结构化 dtype 的提升和比较方面的变化。 
- f2py 的改进。 
详细信息见下文:
新函数#
废弃项#
- 将 - __array_finalize__设置为- None已被废弃。它现在必须是一个方法,并且在检查- None或 NumPy 版本足够新之后,可能需要调用- super().__array_finalize__(obj)。- (gh-20766) 
- 在许多情况下,使用 - axis=32(- axis=np.MAXDIMS) 的含义与- axis=None相同。这已被废弃,必须改用- axis=None。- (gh-20920) 
- 钩子函数 - PyDataMem_SetEventHook已被废弃,其在 tool/allocation_tracking 中的使用示例已删除。现在,Python 通过- tracemalloc内置了跟踪内存分配的能力。- (gh-20394) 
- numpy.distutils已被废弃,因为- distutils本身已被废弃。对于 Python >= 3.12,它将不再包含在 NumPy 中,并将在 Python 3.12 发布两年后完全移除。更多详细信息,请参阅 numpy.distutils 的状态和迁移建议。- (gh-20875) 
- 当请求整数 - dtype但值被格式化为浮点数时,- numpy.loadtxt现在将发出- DeprecationWarning警告。- (gh-21663) 
已过期废弃项#
- 作为持续移除 Python 2 兼容性的一部分, - NpzFile.iteritems()和- NpzFile.iterkeys()方法已被移除。这标志着从 1.15 版本开始的废弃过程的完成。- (gh-16830) 
- alen和- asscalar函数已被移除。- (gh-20414) 
- UPDATEIFCOPY数组标志和枚举- NPY_ARRAY_UPDATEIFCOPY已被移除。相关的(以及已废弃的)- PyArray_XDECREF_ERR也被移除。这些都在 1.14 版本中被废弃。它们被- NPY_ARRAY_WRITEBACKIFCOPY替换,这要求在数组被解除分配之前调用- PyArray_ResolveWritebackIfCopy。- (gh-20589) 
- 在类数组创建期间将引发异常。当一个对象在访问特殊属性 - __array__或- __array_interface__期间引发异常时,该异常通常会被忽略。此行为在 1.21 版本中被废弃,现在将引发异常。- (gh-20835) 
- 不再允许使用非元组值进行多维索引。以前,诸如 - arr[ind]的代码(其中- ind = [[0, 1], [0, 1]])会产生一个- FutureWarning,并被解释为多维索引(即- arr[tuple(ind)])。现在,此示例被视为单个维度上的数组索引(- arr[array(ind)])。NumPy 1.15 中废弃了除元组之外的任何多维索引方式。- (gh-21029) 
- F-contiguous 数组中不再允许更改为不同大小的 dtype。自 Numpy 1.11.0 起已废弃。有关此更改影响的详细解释,请参见下文。 - (gh-20722) 
新特性#
crackfortran 支持运算符和赋值重载#
crackfortran 解析器现在可以理解模块中的运算符和赋值定义。它们被添加到模块的 body 列表中,其中包含一个新的键 implementedby,列出了实现运算符或赋值的子例程或函数的名称。
(gh-15006)
f2py 支持从派生类型语句中读取访问类型属性#
因此,不再需要使用 public 或 private 语句来指定派生类型访问属性。
(gh-15844)
新参数 ndmin 已添加到 genfromtxt#
此参数的行为与 numpy.loadtxt 中的 ndmin 相同。
(gh-20500)
np.loadtxt 现在支持引号字符和单个转换器函数#
numpy.loadtxt 现在支持一个额外的 quotechar 关键字参数,该参数默认未设置。使用 quotechar='"' 将读取 Excel CSV 方言中使用的带引号字段。
此外,现在可以为 converters 参数传递单个可调用对象,而不是字典。
(gh-20580)
更改为不同大小的 dtype 现在仅要求最后一个轴连续#
以前,用不同项目大小的 dtype 查看数组要求整个数组是 C 连续的。此限制会不必要地强迫用户在更改 dtype 之前对非连续数组进行连续复制。
此更改不仅影响 ndarray.view,还影响其他构造机制,包括不推荐的直接赋值给 ndarray.dtype。
此更改解除了发布说明中其他地方描述的关于 F-contiguous 数组视图的废弃项。
(gh-20722)
F2PY 的确定性输出文件#
对于 F77 输入,f2py 将无条件生成 modname-f2pywrappers.f,尽管它们可能为空。对于自由格式输入,modname-f2pywrappers.f 和 modname-f2pywrappers2.f90 都将无条件生成,并且可能为空。这允许在 cmake 或 meson 以及其他构建系统中编写通用输出规则。通过向 f2py 传递 --skip-empty-wrappers 可以恢复旧行为。通过 meson 使用 详细说明了用法。
(gh-21187)
average 函数的 keepdims 参数#
参数 keepdims 已添加到函数 numpy.average 和 numpy.ma.average。该参数的含义与在约简函数(如 numpy.sum 或 numpy.mean)中相同。
(gh-21485)
新参数 equal_nan 已添加到 np.unique#
在 1.21 版本中,np.unique 发生了变化,将所有 NaN 值视为相等并返回单个 NaN。设置 equal_nan=False 将恢复 1.21 之前的行为,即将 NaNs 视为唯一。默认值为 True。
(gh-21623)
兼容性说明#
1D np.linalg.norm 即使对于标量结果也保留浮点输入类型#
以前,当 ord 参数不是显式列出的值之一时,例如 ord=3,它会被提升为 float64。
>>> f32 = np.float32([1, 2])
>>> np.linalg.norm(f32, 2).dtype
dtype('float32')
>>> np.linalg.norm(f32, 3)
dtype('float64')  # numpy 1.22
dtype('float32')  # numpy 1.23
此更改仅影响 float32 和 float16 向量,其 ord 值不是 -Inf、0、1、2 和 Inf。
(gh-17709)
结构化(void)dtype 提升和比较的变化#
通常,NumPy 现在通过提升每个字段的子类型而非引发异常来定义结构化 dtype 的正确但略有限制的提升。
>>> np.result_type(np.dtype("i,i"), np.dtype("i,d"))
dtype([('f0', '<i4'), ('f1', '<f8')])
对于提升匹配,强制执行字段名、顺序和标题,但忽略填充。涉及结构化 dtype 的提升现在始终确保所有字段使用原生字节序(这可能会改变 np.concatenate 的结果),并确保结果是“打包”的,即所有字段连续排列并且填充被移除。有关详细信息,请参阅 结构比较和提升。
对齐结构的 repr 现在永远不会打印包含 offsets 和 itemsize 的长格式,除非结构包含 align=True 不保证的填充。
与上述提升逻辑的更改一致,类型转换安全性已更新
- "equiv"强制匹配名称和标题。由于填充,项目大小允许不同。
- "safe"允许字段名称和标题不匹配
- 类型转换安全性受限于每个包含字段的类型转换安全性。 
- 字段的顺序用于决定每个单独字段的类型转换安全性。以前,使用字段名,并且只有在名称不匹配时才可能进行不安全的类型转换。 
这里最重要的变化是,名称不匹配现在被视为“安全”的类型转换。
(gh-19226)
NPY_RELAXED_STRIDES_CHECKING 已被移除#
NumPy 不能再用 NPY_RELAXED_STRIDES_CHECKING=0 进行编译。宽松步长多年来一直是默认设置,该选项最初是为了实现更平滑的过渡而引入的。
(gh-20220)
np.loadtxt 已进行多项更改#
numpy.loadtxt 的行计数问题已修复。loadtxt 会忽略文件中的完全空行,但以前会将它们计入 max_rows。现在,当使用 max_rows 且文件包含空行时,这些空行将不再被计数。以前,即使有更多数据可读,结果也可能包含少于 max_rows 的行。如果需要旧行为,可以使用 itertools.islice。
import itertools
lines = itertools.islice(open("file"), 0, max_rows)
result = np.loadtxt(lines, ...)
尽管 numpy.loadtxt 通常更快并有所改进,但现在它可能无法将某些以前成功读取的字符串转换为数字。其中最重要的情形是:
- 将诸如 - 1.0的浮点值解析为整数现已废弃。
- 解析诸如 - 0x3p3的十六进制浮点数将失败。
- 以前, - _曾被接受为千位分隔符,例如- 100_000。现在这将导致错误。
如果您遇到这些限制,都可以通过传递适当的 converters= 参数来解决。NumPy 现在支持传递单个转换器用于所有列,以使其更方便。例如,converters=float.fromhex 可以读取十六进制浮点数,而 converters=int 将能够读取 100_000。
此外,错误消息已普遍得到改进。然而,这意味着错误类型可能有所不同。特别是,当单个条目解析失败时,现在总是会引发 ValueError。
(gh-20580)
改进#
ndarray.__array_finalize__ 现在可调用#
这意味着子类现在可以使用 super().__array_finalize__(obj),而无需担心 ndarray 是否是它们的超类。实际调用仍然是一个空操作。
(gh-20766)
添加对 VSX4/Power10 的支持#
通过启用 VSX4/Power10,Power ISA 3.1 中可用的新指令可用于加速某些 NumPy 操作,例如 floor_divide、modulo 等。
(gh-20821)
np.fromiter 现在接受对象和子数组#
numpy.fromiter 函数现在支持对象和子数组 dtype。有关示例,请参阅其函数文档。
(gh-20993)
Math C 库功能检测现在使用正确的签名#
编译之前会有一个检测阶段,以确定底层 libc 是否支持某些数学运算。以前,此代码不遵循正确的签名。修复此问题使得能够为 wasm-ld 后端(用于 WebAssembly 的编译)进行编译,并减少警告数量。
(gh-21154)
np.kron 现在维护子类信息#
np.kron 在计算输入 Kronecker 积时,现在会维护子类信息,例如遮罩数组。
>>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
>>> np.kron(x,x)
masked_array(
  data=[[1, --, --, --],
        [--, 4, --, --],
        [--, --, 4, --],
        [--, --, --, 16]],
  mask=[[False,  True,  True,  True],
        [ True, False,  True,  True],
        [ True,  True, False,  True],
        [ True,  True,  True, False]],
  fill_value=999999)
警告
np.kron 输出现在遵循 ufunc 排序(multiply)来确定输出类类型。
>>> class myarr(np.ndarray):
>>>    __array_priority__ = -1
>>> a = np.ones([2, 2])
>>> ma = myarray(a.shape, a.dtype, a.data)
>>> type(np.kron(a, ma)) == np.ndarray
False # Before it was True
>>> type(np.kron(a, ma)) == myarr
True
(gh-21262)
性能改进和变化#
更快的 np.loadtxt#
numpy.loadtxt 现在通常比以前快得多,因为它的大部分现在都在 C 中实现。
(gh-20580)
更快的约简运算符#
对连续的基于整数的数组执行诸如 numpy.sum、numpy.prod、numpy.add.reduce、numpy.logical_and.reduce 等约简操作现在快得多。
(gh-21001)
更快的 np.where#
现在 numpy.where 在处理不可预测/随机输入数据时比以前快得多。
(gh-21130)
NumPy 标量上的操作更快#
许多 NumPy 标量上的操作现在明显更快,尽管在某些情况下,罕见的操作(例如使用 0-D 数组而不是标量)可能会变慢。然而,即使有了这些改进,对于那些希望其标量获得最佳性能的用户,仍可能希望使用 scalar.item() 将已知的 NumPy 标量转换为 Python 标量。
(gh-21188)
更快的 np.kron#
numpy.kron 快了大约 80%,因为现在使用广播计算乘积。
(gh-21354)