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_name

    • structured_to_unstructured

    • unstructured_to_structured

    • apply_along_fields

    • require_fields

    有关更多信息,请参见用户指南:<https://docs.scipy.org/doc/numpy/user/basics.rec.html>.

新的弃用#

  • 类型字典 numpy.core.typeNAnumpy.core.sctypeNA 已弃用.它们存在错误且未文档化,将在 1.18 版本中删除.请改用 numpy.sctypeDict .

  • numpy.asscalar 函数已弃用.它是功能更强大的 numpy.ndarray.item 的别名,未经测试,并且对标量无效.

  • numpy.set_array_opsnumpy.get_array_ops 函数已弃用. 作为 NEP 15 的一部分,它们已与 C-API 函数 PyArray_SetNumericOpsPyArray_GetNumericOps 一起被弃用. 希望覆盖内置 ufunc 中的内部循环函数的用户应使用 PyUFunc_ReplaceLoopBySignature .

  • numpy.unravel_index 关键字参数 dims 已弃用,请改用 shape .

  • numpy.histogramnormed 参数已弃用.它之前已被弃用,但没有发出警告.

  • 应用于非数字数组的 positive 运算符 ( + ) 已弃用.有关详细信息,请参见下文.

  • 将迭代器传递给堆栈函数已弃用

已过期的弃用#

  • 现在,NaT 比较返回 False ,且没有警告,完成了 NumPy 1.11 中开始的弃用周期.

  • np.lib.function_base.unique 已删除,完成了 NumPy 1.4 中开始的弃用周期.请改用 numpy.unique .

  • 多字段索引现在返回视图而不是副本,完成了 NumPy 1.7 中开始的弃用周期. 此更改先前已在 NumPy 1.14 中尝试过,但已恢复到现在.

  • np.PackageLoadernp.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呈现. 当前格式是实验性的,并且可能会发生变化.

randintchoice 现在可以处理空分布#

即使不需要绘制任何元素,当参数描述空分布是, np.random.randintnp.random.choice 也会引发错误. 此问题已得到修复,例如 np.random.choice([], 0) == np.array([], dtype=float64) .

linalg.lstsq , linalg.qr , 和 linalg.svd 现在可以处理空数组#

以前,当传入空矩阵/空矩阵(具有零行和/或列)时,会引发 LinAlgError . 现在返回适当形状的输出.

链接异常,为无效的PEP3118格式字符串提供更好的错误消息#

这应该有助于追踪问题.

Einsum优化路径更新和效率改进#

Einsum已与当前的上游工作同步.

numpy.anglenumpy.expand_dims 现在可以处理 ndarray 子类#

特别是,它们现在可以用于masked arrays.

NPY_NO_DEPRECATED_API 编译器警告抑制#

NPY_NO_DEPRECATED_API 设置为值0将抑制使用已弃用的numpy API时当前的编译器警告.

np.diff 添加了kwargs prepend和append#

新的kwargs prependappend 允许在差异的任一端插入值.类似于 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 , FDEBUGFFLAGS . 有关更多详细信息,请参见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.clipclip 方法检查内存重叠#

现在总是测试这些函数的 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_orlogical_xor )现在具有 bool 类型的 identity ,而以前它们是 int 类型.这恢复了使用这些ufunc减少空对象数组时获取 bool 的1.14行为,同时保持了使用诸如 addmultiply 之类的算术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 , logspacegeomspace 的起始和停止数组#

这些函数过去仅限于标量停止和起始值,但现在可以采用数组,这些数组将被适当地广播,并导致输出预先添加一个轴. 例如,这可以用于获得点集之间的线性插值点.

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) .

maximumminimum 不再发出警告#

作为 1.10 中引入的代码的一部分,当在使用 SSE2 语义时,在 numpy.maximumnumpy.minimum 中遇到 Nan 时, float32float64 会设置无效的浮点状态.这导致有时会发出 RuntimeWarning .在 1.15 中,我们修复了导致警告变得更加明显的不一致之处.现在不会发出任何警告.

Umath 和 multiarray c-extension 模块合并为一个模块#

根据 NEP 15 ,这两个模块已合并.以前, np.core.umathnp.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.