NumPy 1.23.0 发行说明#

NumPy 1.23.0 版本继续进行改进 dtype 的处理和提升,提高执行速度,阐明文档以及使旧的弃用过期.亮点包括:

  • 在 C 中实现 loadtxt ,大大提升了其性能.

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

  • 更改结构化 dtype 的提升和比较.

  • 改进 f2py.

有关详细信息,请参见下文.

新函数#

  • ndenumerate 的 masked array 特化现在可用作 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 将跟踪分配的功能内置到 python 中.

    ( gh-20394 )

  • 由于 distutils 本身已被弃用,因此 numpy.distutils 也已被弃用.它将不会出现在 Python >= 3.12 的 NumPy 中,并将于 Python 3.12 发布 2 年后完全删除.有关更多详细信息,请参阅 numpy.distutils 的状态和迁移建议 .

    ( gh-20875 )

  • 当请求整数 dtype 但该值格式为浮点数时, numpy.loadtxt 现在将给出 DeprecationWarning .

    ( gh-21663 )

已过期的弃用#

  • 作为持续删除 Python 2 兼容性的一部分, NpzFile.iteritems()NpzFile.iterkeys() 方法已被删除.这结束了从 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 解析器现在可以理解模块中的运算符和赋值定义.它们被添加到模块的 body 列表中,该列表包含一个新的键 implementedby ,其中列出了实现运算符或赋值的子例程或函数的名称.

( gh-15006 )

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

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

( 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 连续数组的查看的弃用过期,这在发行说明的其他地方有描述.

( gh-20722 )

F2PY 的确定性输出文件#

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

( gh-21187 )

averagekeepdims 参数#

参数 keepdims 已添加到函数 numpy.averagenumpy.ma.average 中. 该参数的含义与约简函数(例如 numpy.sumnumpy.mean )中的含义相同.

( gh-21485 )

新参数 equal_nan 添加到 np.unique#

np.unique 在 1.21 中进行了更改,将所有 NaN 值视为相等并返回单个 NaN . 设置 equal_nan=False 将恢复 pre-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 不是 -Inf , 0 , 1 , 2Inf 之一.

( 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 的结果),并确保结果将是“packed”,即所有字段都是连续排序的并且填充被删除. 有关更多详细信息,请参见 结构体比较和提升 .

现在,除非结构包含 align=True 无法保证的填充,否则对齐结构的 repr 将永远不会打印包括 offsetsitemsize 的长格式.

为了与上述对提升逻辑的更改保持一致,已更新了类型转换安全性:

  • "equiv" 强制匹配名称和标题.由于填充,itemsize 允许不同.

  • "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 函数现在支持对象和子数组 dtypes.请参阅该函数文档以获取示例.

( gh-20993 )

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

编译之前会进行检测阶段,以确定底层 libc 是否支持某些数学运算. 以前,此代码不遵守正确的签名. 修复此问题可以为 wasm-ld 后端(用于 WebAssembly 的编译)启用编译,并减少警告的数量.

( gh-21154 )

np.kron 现在维护子类信息#

在计算输入的 Kronecker 积时, 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.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 )