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)
钩子函数
PyDataMem_SetEventHook
已被弃用,其在 tool/allocation_tracking 中的使用示例也已被删除。现在可以通过tracemalloc
在 python 中内置跟踪分配。(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)
不允许使用非元组值进行多维索引。以前,当
ind = [[0, 1], [0, 1]]
时,代码如arr[ind]
会产生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 支持从派生类型语句读取访问类型属性#
因此,无需使用 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
的结果)并确保结果将是“打包的”,即所有字段都是连续排序的,并且填充已被移除。有关更多详细信息,请参阅 结构比较和提升。
对齐结构的 repr
现在将永远不会打印包括 offsets
和 itemsize
的长格式,除非该结构包含 align=True
不保证的填充。
与上述对提升逻辑的更改一致,已更新了转换安全性。
"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
函数现在支持对象和子数组 dtype。请参阅函数文档以了解示例。
(gh-20993)
数学 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维数组而不是标量)可能会变慢。但是,即使有了这些改进,对于希望获得标量最佳性能的用户,可能仍需要使用scalar.item()
将已知的NumPy标量转换为Python标量。
(gh-21188)
更快的np.kron
#
由于现在使用广播计算乘积,numpy.kron
的速度提高了约80%。
(gh-21354)