NumPy 1.16.0 发行说明#
此 NumPy 版本是最后一个支持 Python 2.7 的版本,并将作为长期版本进行维护,并提供错误修复,直到 2020 年.已删除对 Python 3.4 的支持,支持的 Python 版本为 2.7 和 3.5-3.7. PyPI 上的 wheels 链接到 OpenBLAS v0.3.4+,这应该可以解决在以前的 OpenBLAS 版本中发现的已知线程问题.
构建此版本的下游开发者应使用 Cython >= 0.29,如果使用 OpenBLAS,则使用 OpenBLAS > v0.3.4.
此版本进行了大量重构,并具有许多错误修复,改进的代码组织以及更好的跨平台兼容性.并非所有这些改进对用户都是可见的,但它们应该有助于简化未来的维护.
亮点#
实验性的(仅限选择加入)支持覆盖 numpy 函数,请参见下面的
__array_function__.matmul函数现在是一个 ufunc.这提供了更好的性能,并允许使用__array_ufunc__覆盖.改进了对 ARM 和 POWER 架构的支持.
改进了对 AIX 和 PyPy 的支持.
改进了与 ctypes 的互操作性.
改进了对 PEP 3118 的支持.
新函数#
添加到 numpy.lib.recfuntions 模块的新函数,以简化结构化分配更改:
assign_fields_by_namestructured_to_unstructuredunstructured_to_structuredapply_along_fieldsrequire_fields
有关更多信息,请参见用户指南:<https://docs.scipy.org/doc/numpy/user/basics.rec.html>.
新的弃用#
类型字典 numpy.core.typeNA 和 numpy.core.sctypeNA 已弃用.它们存在错误且未文档化,将在 1.18 版本中删除.请改用
numpy.sctypeDict.numpy.asscalar 函数已弃用.它是功能更强大的
numpy.ndarray.item的别名,未经测试,并且对标量无效.numpy.set_array_ops 和 numpy.get_array_ops 函数已弃用. 作为 NEP 15 的一部分,它们已与 C-API 函数
PyArray_SetNumericOps和PyArray_GetNumericOps一起被弃用. 希望覆盖内置 ufunc 中的内部循环函数的用户应使用PyUFunc_ReplaceLoopBySignature.numpy.unravel_index关键字参数dims已弃用,请改用shape.numpy.histogram的normed参数已弃用.它之前已被弃用,但没有发出警告.应用于非数字数组的
positive运算符 (+) 已弃用.有关详细信息,请参见下文.将迭代器传递给堆栈函数已弃用
已过期的弃用#
现在,NaT 比较返回
False,且没有警告,完成了 NumPy 1.11 中开始的弃用周期.np.lib.function_base.unique已删除,完成了 NumPy 1.4 中开始的弃用周期.请改用numpy.unique.多字段索引现在返回视图而不是副本,完成了 NumPy 1.7 中开始的弃用周期. 此更改先前已在 NumPy 1.14 中尝试过,但已恢复到现在.
np.PackageLoader和np.pkgload已被删除. 这些在 1.10 中已弃用,没有测试,并且似乎在 1.15 中不再起作用.
将来的更改#
NumPy 1.17 将不再支持 Python 2.7.
兼容性说明#
Windows 上的 f2py 脚本#
在 Windows 上,用于运行 f2py 的已安装脚本现在是一个 .exe 文件,而不是 *.py 文件,并且只要 Scripts 目录在路径中,就应该从命令行将其作为 f2py 运行. 将 f2py 作为模块运行 python -m numpy.f2py [...] 将在任何 NumPy 版本中无需修改路径即可工作.
NaT 比较#
与 NaN 的行为一致,现在所有比较(除了与 datetime64 或 timedelta64 NaT(“非时间”)值的不等式检查)总是返回 False ,而与 NaT 的不等式检查现在总是返回 True . 这包括 NaT 值之间的比较. 为了与旧的行为兼容,请使用 np.isnat 显式检查 NaT,或在进行比较之前使用 .astype(np.int64) 转换 datetime64/timedelta64 数组.
complex64/128 的对齐方式已更改#
现在,复数类型的内存对齐方式与由两个浮点值组成的 C 结构相同,而以前它等于类型的大小.对于许多用户(例如在 x64/unix/gcc 上),这意味着 complex64 现在是 4 字节对齐,而不是 8 字节对齐.一个重要的结果是,对齐的结构化 dtypes 现在可能具有不同的大小.例如, np.dtype('c8,u1', align=True) 过去(在 x64/gcc 上)的项目大小为 16,但现在为 12.
更详细地说,complex64 类型现在具有与 C 结构 struct {float r, i;} 相同的对齐方式,这取决于用于编译 numpy 的编译器,complex128 和 complex256 类型也是如此.
移除 nd_grid 的 __len__#
len(np.mgrid) 和 len(np.ogrid) 现在被认为是没有意义的,并引发 TypeError .
np.unravel_index 现在接受 shape 关键字参数#
以前,只有 dims 关键字参数被接受,用于指定用于解包的数组的形状. dims 仍然受支持,但现在已弃用.
多字段视图返回视图而不是副本#
使用多个字段索引结构化数组,例如 arr[['f1', 'f3']] ,会返回到原始数组的视图,而不是副本.与以前不同,返回的视图通常具有与原始数组中中间字段相对应的额外填充字节,这将影响诸如 arr[['f1', 'f3']].view('float64') 之类的代码.自 numpy 1.7 以来,已经计划了此更改.自那时以来,命中此路径的操作已发出 FutureWarnings .在 1.12 中添加了有关此更改的其他 FutureWarnings .
为了帮助用户更新其代码以适应这些更改,已将许多函数添加到 numpy.lib.recfunctions 模块,这些函数可以安全地执行此类操作.例如,上面的代码可以用 structured_to_unstructured(arr[['f1', 'f3']], dtype='float64') 代替.请参阅 user guide 的“访问多个字段”部分.
C API 更改#
由于添加了以下内容, NPY_FEATURE_VERSION 增加到 0x0000D:
新特性#
将积分平方误差 (ISE) 估计器添加到 histogram#
这种优化 bin 数量的方法 ( bins='stone' ) 是 Scott 规则的推广. Scott 规则假设分布近似于正态分布,而 ISE 是基于交叉验证的非参数方法.
为 np.loadtxt 添加了 max_rows 关键字#
numpy.loadtxt 中的新关键字 max_rows 设置在 skiprows 之后要读取的内容的最大行数,如 numpy.genfromtxt 中一样.
为 np.timedelta64 操作数添加了模运算符支持#
现在支持对两种 np.timedelta64 类型的操作数使用模(余数)运算符.操作数可以具有不同的单位,并且返回值将匹配操作数的类型.
改进#
numpy 数组的无复制 pickle#
在协议 4 之前,numpy 数组 pickle 创建了 2 个要序列化的数据的虚假副本.使用 pickle 协议 5 和 PickleBuffer API,现在可以使用带外缓冲区序列化各种大型 numpy 数组,而无需任何复制,并使用带内缓冲区减少一次复制.对于大型数组,这导致峰值内存使用量最多减少 66%.
构建shell独立性#
NumPy的构建过程不应再直接与主机shell进行交互.在适当的地方, exec_command 已被替换为 subprocess.check_output .
np.polynomial.Polynomial 类在Jupyter Notebook中以LaTeX格式呈现#
当在支持它的前端中使用时, Polynomial 实例现在通过LaTeX呈现. 当前格式是实验性的,并且可能会发生变化.
randint 和 choice 现在可以处理空分布#
即使不需要绘制任何元素,当参数描述空分布是, np.random.randint 和 np.random.choice 也会引发错误. 此问题已得到修复,例如 np.random.choice([], 0) == np.array([], dtype=float64) .
linalg.lstsq , linalg.qr , 和 linalg.svd 现在可以处理空数组#
以前,当传入空矩阵/空矩阵(具有零行和/或列)时,会引发 LinAlgError . 现在返回适当形状的输出.
链接异常,为无效的PEP3118格式字符串提供更好的错误消息#
这应该有助于追踪问题.
Einsum优化路径更新和效率改进#
Einsum已与当前的上游工作同步.
numpy.angle 和 numpy.expand_dims 现在可以处理 ndarray 子类#
特别是,它们现在可以用于masked arrays.
NPY_NO_DEPRECATED_API 编译器警告抑制#
将 NPY_NO_DEPRECATED_API 设置为值0将抑制使用已弃用的numpy API时当前的编译器警告.
np.diff 添加了kwargs prepend和append#
新的kwargs prepend 和 append 允许在差异的任一端插入值.类似于 ediff1d 的选项. 现在可以通过 prepend=0 轻松获得 cumsum 的逆.
ARM支持已更新#
ARM CPU的支持已更新,以适应32和64位目标,以及大端和小端字节顺序. AARCH32内存对齐问题已得到解决. CI测试已扩展到包括通过shippable.com服务提供的AARCH64目标.
追加到构建标志#
numpy.distutils 始终覆盖而不是追加用于编译Fortran扩展的 LDFLAGS 和其他类似的此类环境变量. 现在,如果 NPY_DISTUTILS_APPEND_FLAGS 环境变量设置为1,则该行为将是追加. 这适用于:LDFLAGS , F77FLAGS , F90FLAGS , FREEFLAGS , FOPT , FDEBUG 和 FFLAGS . 有关更多详细信息,请参见gh-11525.
广义ufunc签名现在允许固定大小的维度#
通过在广义ufunc的签名中使用数值,可以指示给定的函数需要输入或输出具有给定大小的维度. 例如,将极角转换为二维笛卡尔单位向量的函数的签名将为 ()->(2) ; 将两个球面角转换为三维单位向量的那个将是 (),()->(3) ; 两个三维向量的叉积的签名将是 (3),(3)->(3) .
请注意,对于基本函数,这些维度与以字母开头的名称的变量维度没有任何区别. 循环仍然传递相应的大小,但是现在可以依靠该大小等于签名中给定的固定大小.
广义ufunc签名现在允许灵活的维度#
某些函数,特别是 numpy 中将 @ 实现为 matmul 的方式,与广义 ufunc 非常相似,因为它们在核心维度上运行,但不能将它们表示成这样,因为它们能够处理缺少维度的情况.为了支持这一点,现在允许在维度名称后附加问号,以指示该维度不一定存在.
通过此添加, matmul 的签名可以表示为 (m?,n),(n,p?)->(m?,p?) .这表示,例如,如果第二个操作数只有一个维度,那么为了初等函数的目的,它将被视为具有核心形状 (n, 1) ,并且输出具有相应的核心形状 (m, 1) .然而,实际的输出数组会移除这个灵活的维度,即它将具有形状 (..., m) .类似地,如果两个参数都只有一个维度,那么输入将被表示为具有形状 (1, n) 和 (n, 1) 到初等函数,并且输出为 (1, 1) ,而返回的实际输出数组将具有形状 () .通过这种方式,该签名允许您为四个相关但不同的签名使用一个初等函数: (m,n),(n,p)->(m,p) , (n),(n,p)->(p) , (m,n),(n)->(m) 和 (n),(n)->() .
np.clip 和 clip 方法检查内存重叠#
现在总是测试这些函数的 out 参数是否存在内存重叠,以避免在发生内存重叠时结果损坏.
np.polyfit 中选项 cov 的新值 unscaled#
np.polyfit 函数的 cov 参数添加了另一个可能的值.使用 cov='unscaled' 可以完全禁用协方差矩阵的缩放(类似于在 scipy.optimize.curve_fit 中设置 absolute_sigma=True ).这在某些情况下非常有用,例如权重由 1/sigma 给出,其中 sigma 是(高斯分布)数据点的(已知)标准误差,在这种情况下,未缩放的矩阵已经是协方差矩阵的正确估计.
标量数值类型的详细文档字符串#
当应用于诸如 numpy.intc , numpy.int_ 和 numpy.longlong 等数值类型时, help 函数现在会列出该类型的所有别名,区分平台相关和平台无关的别名.
__module__ 属性现在指向公共模块#
大多数 NumPy 函数的 __module__ 属性已更新,以引用从中访问函数的首选公共模块,而不是定义该函数的模块.这为 IPython 等工具中的函数生成更丰富的信息显示,例如,您现在看到 <function 'numpy.sum'> 而不是 <function 'numpy.core.fromnumeric.sum'> .
大型分配标记为适合透明巨页的#
在支持通过 madvise 系统调用实现透明巨页的系统上,numpy 现在标记可以通过巨页支持的大型内存分配,这减少了页面错误开销,并且在某些故障较重的情况下可以显着提高性能.在 Linux 上,要使用的巨页的设置 /sys/kernel/mm/transparent_hugepage/enabled 必须至少为 madvise .已经设置为 always 的系统不会看到太多差异,因为内核会在适当的时候自动使用巨页.
非常旧的 Linux 内核(~3.x 及更旧版本)的用户应确保 /sys/kernel/mm/transparent_hugepage/defrag 未设置为 always ,以避免内存碎片整理中的并发问题导致性能问题.
Alpine Linux(和其他 musl c 库发行版)支持#
我们现在默认使用 fenv.h 进行浮点状态错误报告.以前,我们有一个错误的默认设置,有时不会报告下溢,溢出和无效的浮点运算.现在,只要它们提供 fenv.h ,我们就可以支持像 Alpine Linux 这样的非 glibc 发行版.
加速大型数组的 np.block#
现在,大型数组(大于 512 * 512 )使用一种基于将数据直接复制到结果数组的适当切片中的分块算法.这显著加快了这些大型数组的速度,特别是对于沿超过 2 个维度分块的数组.
arr.ctypes.data_as(...) 持有对arr的引用#
以前,调用者负责在指针的生命周期内保持数组的活动状态.
加速只读数组的 np.take#
当源数组的 writeable 标志设置为 False 时, np.take 的实现不再对源数组进行不必要的复制.
支持更多函数的path-like对象#
除了文件对象之外, np.core.records.fromfile 函数现在还支持 pathlib.Path 和其他path-like对象.此外,当使用内存映射( mmap_mode 关键字参数)时, np.load 函数现在还支持path-like对象.
在归约期间ufunc identities的更好的行为#
通用函数具有一个 .identity ,当对空轴调用 .reduce 时使用该identity.
在此版本中,逻辑二进制ufunc( logical_and , logical_or 和 logical_xor )现在具有 bool 类型的 identity ,而以前它们是 int 类型.这恢复了使用这些ufunc减少空对象数组时获取 bool 的1.14行为,同时保持了使用诸如 add 和 multiply 之类的算术ufunc减少空对象数组时获取 int 的1.15行为.
此外, logaddexp 现在具有 -inf 的identity,允许它在空序列上调用,而以前它不能.
这要归功于新的 PyUFunc_FromFuncAndDataAndSignatureAndIdentity ,它允许将任意值用作identity.
改进了从ctypes对象转换#
Numpy一直支持从 ctypes 获取值或类型并将其转换为数组或dtype,但仅对简单的类型表现正确. 从这个版本开始, 这个警告被取消–现在:
ctypes.Structure的_pack_属性用于模拟C的__attribute__((packed)),受到尊重.保留所有ctypes对象的字节序
支持
ctypes.Union不可表示的结构引发异常,而不是产生危险的错误结果:
位域不再被解释为子数组
指针不再被它们指向的类型替换
一个新的 ndpointer.contents 成员#
这与常规ctypes数组的 .contents 成员匹配,可用于围绕指针内容构造 np.array . 这取代了 np.array(some_nd_pointer) ,它在1.15中停止工作. 作为此更改的副作用, ndpointer 现在支持具有重叠字段和填充的dtypes.
matmul 现在是一个 ufunc#
numpy.matmul 现在是一个ufunc,这意味着该函数和 __matmul__ 运算符现在都可以被 __array_ufunc__ 覆盖. 它的实现也发生了变化. 它使用与 numpy.dot 相同的BLAS例程,确保它在大矩阵上的性能相似.
用于 linspace , logspace 和 geomspace 的起始和停止数组#
这些函数过去仅限于标量停止和起始值,但现在可以采用数组,这些数组将被适当地广播,并导致输出预先添加一个轴. 例如,这可以用于获得点集之间的线性插值点.
CI 扩展了更多服务#
现在我们使用额外的免费 CI 服务,感谢以下公司提供:
通过 codecov.io 进行代码覆盖率测试
通过 shippable.com 进行 Arm 测试
在 Azure Pipelines 上运行额外的测试
除了持续使用 travis,appveyor(用于 wheels)和 LGTM 之外,这些都是额外的
变更#
比较ufuncs现在会报错,而不是返回 NotImplemented#
以前,如果比较ufunc函数(如 np.equal )的参数具有结构化的dtypes时,会返回 NotImplemented ,以帮助比较运算符(如 __eq__ )处理这些.由于相关的逻辑已经转移到比较运算符本身 (因此会继续根据需要返回 NotImplemented ),所以不再需要这样处理.因此,与所有其他ufunc一样,比较ufunc现在将在结构化的dtypes上报错.
Positive现在将为非数值数组引发弃用警告#
以前, +array 无条件地返回一个副本.现在,如果数组不是数值的,将会引发一个 DeprecationWarning (即,如果 np.positive(array) 引发一个 TypeError ).对于覆盖默认 __array_ufunc__ 实现的 ndarray 子类, TypeError 会被传递下去.
NDArrayOperatorsMixin 现在实现了矩阵乘法#
以前, np.lib.mixins.NDArrayOperatorsMixin 没有实现Python矩阵乘法运算符( @ )的特殊方法.现在 matmul 是一个 ufunc,可以使用 __array_ufunc__ 重写,所以情况发生了变化.
np.polyfit 中协方差矩阵的缩放比例不同#
到目前为止, np.polyfit 在协方差矩阵的缩放比例中使用了非标准因子.也就是说,它没有使用标准的 chisq/(M-N) ,而是使用 chisq/(M-N-2) 进行缩放,其中 M 是数据点的数量,N 是参数的数量.这种缩放与诸如 scipy.optimize.curve_fit 之类的其他拟合程序不一致,因此已更改为 chisq/(M-N) .
maximum 和 minimum 不再发出警告#
作为 1.10 中引入的代码的一部分,当在使用 SSE2 语义时,在 numpy.maximum 和 numpy.minimum 中遇到 Nan 时, float32 和 float64 会设置无效的浮点状态.这导致有时会发出 RuntimeWarning .在 1.15 中,我们修复了导致警告变得更加明显的不一致之处.现在不会发出任何警告.
Umath 和 multiarray c-extension 模块合并为一个模块#
根据 NEP 15 ,这两个模块已合并.以前, np.core.umath 和 np.core.multiarray 是单独的 c-extension 模块.它们现在是单个 np.core/_multiarray_math c-extension 模块的 python 包装器.
getfield 有效性检查已扩展#
numpy.ndarray.getfield 现在检查 dtype 和 offset 参数,以防止访问无效的内存位置.
NumPy 函数现在支持使用 __array_function__ 进行覆盖#
NumPy 有一个新的实验性机制,用于通过定义一个 __array_function__ 方法来覆盖非 NumPy 数组上几乎所有 NumPy 函数的实现,如 NEP 18 中所述.
此功能尚未默认启用,但已发布以方便潜在用户进行实验. 有关设置适当环境变量的详细信息,请参见 NEP . 我们希望 NumPy 1.17 版本将默认启用覆盖,由于用 C 编写的新实现,其性能也将更高.
基于只读缓冲区的数组不能设置为 writeable#
现在,我们禁止对通过 fromstring(readonly-buffer) 创建的数组设置 writeable 标志为 True.