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已被弃用,并且已删除工具/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 )
不允许使用非元组值进行多维索引.以前,像
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 连续数组的弃用失效,详情请见发行说明的其他地方.
( gh-20722 )
F2PY 的确定性输出文件#
对于 F77 输入, f2py 将无条件生成 modname-f2pywrappers.f ,即使这些文件可能为空.对于自由格式输入, modname-f2pywrappers.f , modname-f2pywrappers2.f90 都将无条件生成,并且可能为空.这允许在 cmake 或 meson 和其他构建系统中编写通用输出规则.可以通过将 --skip-empty-wrappers 传递给 f2py 来恢复旧的行为. 通过 meson 使用 详细介绍了用法.
( gh-21187 )
average 的 keepdims 参数#
参数 keepdims 已添加到函数 numpy.average 和 numpy.ma.average .该参数与在缩减函数(如 numpy.sum 或 numpy.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
此更改仅影响 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 的结果),并确保结果将被 “packed”, 即所有字段连续排序并且删除了填充. 有关更多详细信息,请参见 结构比较和提升 .
现在,除非对齐结构包含 align=True 无法保证的填充,否则对齐结构的 repr 将永远不会打印包含 offsets 和 itemsize 的长格式.
与上述提升逻辑的变更一致,已更新强制转换安全性:
"equiv"强制执行匹配的名称和标题.由于填充,允许itemsize不同."safe"允许不匹配的字段名称和标题.强制转换安全性受每个包含字段的强制转换安全性限制.
字段的顺序用于确定每个单独字段的强制转换安全性. 以前,使用字段名称,并且只有在名称不匹配时才可能进行不安全的强制转换.
这里的主要重要变化是,名称不匹配现在被认为是"安全"强制转换.
( gh-19226 )
NPY_RELAXED_STRIDES_CHECKING 已被移除#
NumPy 现在无法再使用 NPY_RELAXED_STRIDES_CHECKING=0 编译.宽松的 strides 已经成为多年的默认设置,最初引入该选项是为了实现更平滑的过渡.
( 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 后端(Web Assembly 编译)启用编译,并减少警告的数量.
( 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 )