NumPy 1.23.0 发布说明#

NumPy 1.23.0 版本继续进行改进数据类型处理和推广、提高执行速度、澄清文档以及终止旧的弃用的工作.亮点包括:

  • 在C语言中实现 loadtxt ,大大提高了其性能.

  • 在Python级别上公开DLPack以便于轻松数据交换.

  • 对结构化dtypes的推广和比较的更改.

  • 对 f2py 的改进.

详情请见下方,

新功能#

  • ndenumerate 的掩码数组特化现在作为 numpy.ma.ndenumerate 可用.它提供了 numpy.ndenumerate 的替代方案,默认情况下会跳过掩码值.

    (gh-20020)

  • numpy.from_dlpack 已被添加,以允许使用 DLPack 协议轻松交换数据.它接受实现 __dlpack____dlpack_device__ 方法的 Python 对象,并返回一个 ndarray 对象,该对象通常是输入对象数据的视图.

    (gh-21145)

弃用#

  • __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 中对其使用的演示已被移除.现在,通过 tracemalloc 可以内置跟踪分配的能力.

    (gh-20394)

  • numpy.distutils 已被弃用,因为 distutils 本身已被弃用.它将不会出现在 Python >= 3.12 的 NumPy 中,并且将在 Python 3.12 发布后的两年内完全移除.更多详情,请参见 numpy.distutils 的状态和迁移建议.

    (gh-20875)

  • numpy.loadtxt 现在会在请求整数 dtype 但值格式化为浮点数时给出 DeprecationWarning.

    (gh-21663)

过时的弃用#

  • NpzFile.iteritems()NpzFile.iterkeys() 方法已作为持续移除 Python 2 兼容性的一部分被移除.这结束了自 1.15 版本以来的弃用.

    (gh-16830)

  • alenasscalar 函数已被移除.

    (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-连续数组中更改为不同大小的 dtype 不再允许.自 Numpy 1.11.0 起已弃用.请参见下方以获取有关此更改影响的详细解释.

    (gh-20722)

新功能#

crackfortran 支持运算符和赋值重载#

crackfortran 解析器现在理解模块中的运算符和赋值定义.它们被添加到包含新键 implementedby 的模块的 body 列表中,该键列出了实现运算符或赋值的子程序或函数的名称.

(gh-15006)

f2py 支持从派生类型语句中读取访问类型属性#

因此,不需要使用 publicprivate 语句来指定派生类型的访问属性.

(gh-15844)

新增参数 ndmingenfromtxt#

此参数的行为与 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-连续数组的弃用声明失效,这在发布说明的其他地方有所描述.

(gh-20722)

F2PY 的确定性输出文件#

对于F77输入,``f2py`` 将无条件生成 modname-f2pywrappers.f,尽管这些文件可能是空的.对于自由格式输入,``modname-f2pywrappers.f`` 和 modname-f2pywrappers2.f90 都将无条件生成,并且可能为空.这允许在 cmakemeson 及其他构建系统中编写通用的输出规则.可以通过传递 --skip-empty-wrappersf2py 来恢复旧的行为.:ref:f2py-meson 详细说明了用法.

(gh-21187)

keepdims 参数用于 average#

参数 keepdims 被添加到函数 numpy.averagenumpy.ma.average 中.该参数在诸如 numpy.sumnumpy.mean 的归约函数中的含义相同.

(gh-21485)

新增参数 equal_nannp.unique#

np.unique 在 1.21 版本中进行了更改,将所有 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

此更改仅影响 float32float16 向量,且 ord 不是 -Inf012Inf.

(gh-17709)

对结构化(空)dtype 提升和比较的更改#

一般来说,NumPy 现在通过提升每个字段的子类型而不是引发异常,为结构化 dtype 定义了正确但略有局限的提升:

>>> np.result_type(np.dtype("i,i"), np.dtype("i,d"))
dtype([('f0', '<i4'), ('f1', '<f8')])

对于匹配字段名称、顺序和标题的推广,强制执行,但忽略填充.涉及结构化dtypes的推广现在总是确保所有字段的本地字节顺序(这可能会改变 np.concatenate 的结果),并确保结果将是”打包的”,即所有字段都是连续排列的,并且填充被移除.有关更多详细信息,请参见 结构比较和提升.

对齐结构的 repr 现在将永远不会打印包含 offsetsitemsize 的长格式,除非结构包含 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 函数现在支持对象和子数组的数据类型.请参阅函数文档以获取示例.

(gh-20993)

数学C库特性检测现在使用正确的签名#

编译之前会有一个检测阶段,以确定底层 libc 是否支持某些数学运算.之前这段代码没有遵循正确的签名.修复这个问题使得可以为 wasm-ld 后端(为 WebAssembly 编译)启用编译,并减少了警告的数量.

(gh-21154)

np.kron 现在保持子类信息#

np.kron 现在在计算输入的克罗内克积时保持子类信息,例如掩码数组.

>>> 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.sumnumpy.prodnumpy.add.reducenumpy.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)