NumPy 1.23.0 版本说明#
NumPy 1.23.0 版本继续致力于改进 dtype 的处理和提升、提高执行速度、澄清文档以及废弃旧的弃用项。主要亮点包括:
使用 C 语言实现
loadtxt,极大地提高了其性能。在 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)
hook 函数
PyDataMem_SetEventHook已弃用,并且已移除其在 tool/allocation_tracking 中的示例。通过 Python 内置的tracemalloc现在可以跟踪分配。(gh-20394)
numpy.distutils已弃用,这是因为distutils本身已被弃用。对于 Python >= 3.12,它将不再存在于 NumPy 中,并且将在 Python 3.12 发布后 2 年完全移除。有关更多详细信息,请参阅 numpy.distutils 的状态和迁移建议。(gh-20875)
当请求整数
dtype但数值格式为浮点数时,numpy.loadtxt现在会发出DeprecationWarning。(gh-21663)
已过期的弃用#
NpzFile.iteritems()和NpzFile.iterkeys()方法已被移除,这是持续移除 Python 2 兼容性的一部分。这标志着自 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 连续数组中不同大小的 dtype。自 NumPy 1.11.0 版本起已弃用。有关此更改影响的详细说明,请参阅下文。
(gh-20722)
新功能#
crackfortran 支持运算符和赋值重载#
crackfortran 解析器现在能够理解模块中的运算符和赋值定义。它们被添加到包含一个新键 implementedby 的模块的 body 列表中,该键列出了实现运算符或赋值的子程序或函数的名称。
(gh-15006)
f2py 支持从派生类型语句读取访问类型属性#
因此,您无需使用 public 或 private 语句来指定派生类型的访问属性。
(gh-15844)
为 genfromtxt 添加了新的参数 ndmin#
此参数的行为与 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,并且它们可能为空。这允许在 cmake 或 meson 等构建系统中编写通用的输出规则。通过向 f2py 传递 --skip-empty-wrappers 可以恢复旧的行为。 通过 meson 使用 详细说明了用法。
(gh-21187)
average 的 keepdims 参数#
参数 keepdims 已添加到函数 numpy.average 和 numpy.ma.average 中。此参数的含义与 numpy.sum 或 numpy.mean 等归约函数中的含义相同。
(gh-21485)
为 np.unique 添加了新参数 equal_nan#
在 1.21 版本中,np.unique 已更改为将所有 NaN 值视为相等,并返回单个 NaN。将 equal_nan=False 设置将恢复 1.21 版本之前的行为,即将 NaNs 视为唯一。默认值为 True。
(gh-21623)
兼容性说明#
一维 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 的结果),并确保结果是“打包”的,即所有字段按顺序连续排列且填充被移除。有关详细信息,请参阅 结构化 dtype 的比较和提升。
对齐结构的 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)
数学 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)