Numpy 1.16.0发行说明

这个numpy版本是最后一个支持python 2.7的版本,将作为一个长期版本维护,直到2020年才会修复bug。不再支持python 3.4,支持的python版本是2.7和3.5-3.7。pypi上的轮子与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 ,未测试,对scalars失败。

  • 这个 numpy.set_array_opsnumpy.get_array_ops 函数已弃用。作为一部分 NEP 15 ,它们与C-API函数一起被弃用。 PyArray_SetNumericOpsPyArray_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.PackageLoadernp.pkgload 已被删除。这些在1.10中被否决,没有测试,并且似乎在1.15中不再有效。

未来变化

  • numpy 1.17将放弃对python 2.7的支持。

兼容性说明

Windows上的f2py脚本

在Windows上,用于运行f2py的已安装脚本现在是 .exe 文件而不是 *.py 文件,应从命令行运行为 f2py 每当 Scripts 目录在路径中。运行 f2py 作为模块 python -m numpy.f2py [...] 在任何版本的numpy中都可以不修改路径。

NAT比较

与NaN的行为一致,除了用datetime64或timedelta64 nat(“非时间”)值进行不等式检查之外的所有比较现在都始终返回 False ,与nat的不平等检查现在总是返回 True . 这包括两个nat值之间的比较。为了与旧行为兼容,请使用 np.isnat 显式检查NAT或将datetime64/timedelta64数组转换为 .astype(np.int64) 在进行比较之前。

complex64/128对齐方式已更改

现在,复杂类型的内存对齐方式与由两个浮点值组成的C结构相同,而在它等于类型大小之前。对于许多用户(例如在x64/unix/gcc上),这意味着complex64现在是4字节对齐,而不是8字节对齐。一个重要的结果是,对齐的结构化数据类型现在可能具有不同的大小。例如, np.dtype('c8,u1', align=True) 以前的itemsize是16(在x64/gcc上),现在是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 从那时起。附加的 FutureWarnings 关于这一变化,在1.12中增加了。

为了帮助用户更新他们的代码以应对这些更改,已经向 numpy.lib.recfunctions 安全允许此类操作的模块。例如,上面的代码可以替换为 structured_to_unstructured(arr[['f1', 'f3']], dtype='float64') . 请参见 user guide _.

新特点

积分平方误差(ISE)估计量 histogram

这种方法 (bins='stone' )优化bin数是Scott规则的概括。斯科特法则假定分布近似正态,而 ISE 是一种基于交叉验证的非参数化方法。

max_rows keyword added for np.loadtxt

新关键词 max_rows 在里面 numpy.loadtxt 设置要在此后读取的内容的最大行数 skiprows ,如 numpy.genfromtxt .

增加了模运算符支持 np.timedelta64 操作数

模(余数)运算符现在支持两个类型的操作数 np.timedelta64 . 操作数可以有不同的单位,返回值将与操作数的类型匹配。

改进

没有对numpy数组进行复制酸洗

在协议4之前,numpy数组pickle创建了两个被序列化的数据的假副本。使用pickle协议5,以及 PickleBuffer API,现在可以序列化大量的numpy数组,而无需使用带外缓冲区进行任何复制,也无需使用带内缓冲区进行一次复制。对于大型阵列,这会导致峰值内存使用率下降66%。

建立外壳独立性

numpy构建不应该再直接与主机shell交互。 exec_command 已被替换为 subprocess.check_output 在适当的情况下。

np.polynomial.Polynomial 类在Jupyter笔记本的 Latex 中呈现

当用于支持它的前端时, Polynomial 实例现在通过 Latex 渲染。当前格式是实验性的,可能会发生更改。

randintchoice 现在处理空分布

即使不需要绘制元素, np.random.randintnp.random.choice 当参数描述空分发时引发错误。这已被修复,例如 np.random.choice([], 0) == np.array([], dtype=float64) .

linalg.lstsqlinalg.qrlinalg.svd 现在使用空数组

以前,A LinAlgError 当传入空矩阵/空矩阵(行和/或列为零)时将引发。现在返回适当形状的输出。

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

这将有助于跟踪问题。

einsum优化路径更新和效率改进

einsum与当前上游工作同步。

numpy.anglenumpy.expand_dims 现在工作 ndarray 子类

特别是,它们现在适用于屏蔽数组。

NPY_NO_DEPRECATED_API 编译器警告抑制

设置 NPY_NO_DEPRECATED_API 如果值为0,则在使用不推荐使用的numpy API时,将取消当前编译器警告。

np.diff 增加了Kwargs的前置和附加

新克沃斯 prependappend ,允许在差异的两端插入值。类似于 ediff1d . 现在的倒数 cumsum 很容易通过 prepend=0 .

手臂支撑更新

对ARM CPU的支持已经更新,以适应32位和64位的目标,以及大、小端字节顺序。已经解决了AARCH32内存对齐问题。CI测试已经通过shippable.com的服务扩展到包含AARCH64目标。

附加到生成标志

numpy.distutils 始终重写而不是附加到 LDFLAGS 以及其他类似的用于编译Fortran扩展的环境变量。现在,如果 NPY_DISTUTILS_APPEND_FLAGS 环境变量设置为1,行为将追加。这适用于: LDFLAGSF77FLAGSF90FLAGSFREEFLAGSFOPTFDEBUGFFLAGS . 详见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 这些函数的参数现在总是测试内存重叠,以避免发生内存重叠时出现损坏的结果。

新价值 unscaled 供选择 cov 在里面 np.polyfit

进一步增加了 cov 的参数 np.polyfit 功能。用 cov='unscaled' 协方差矩阵的缩放完全禁用(类似于设置 absolute_sigma=True 在里面 scipy.optimize.curve_fit )这在1/sigma给出权重,sigma是(高斯分布)数据点的(已知)标准误差的情况下是有用的,在这种情况下,未标度矩阵已经是协方差矩阵的正确估计。

标量数字类型的详细文档字符串

这个 help 函数,当应用于数字类型时,例如 numpy.intcnumpy.int_numpy.longlong ,现在列出该类型的所有别名,区分与平台相关的别名和独立的别名。

__module__ 属性现在指向公共模块

这个 __module__ 大多数numpy函数的属性已经更新,以引用从中访问函数的首选公共模块,而不是恰好定义函数的模块。这将为工具(如ipython)中的函数(而不是 <function 'numpy.core.fromnumeric.sum'> 你现在看到了 <function 'numpy.sum'> .

大分配标记为适合透明护膝

在支持透明Hugepages而不是Madvise系统的系统上,调用numpy现在标志着大型内存分配可以由Hugepages支持,这可以减少页面错误开销,并且在某些故障严重的情况下可以显著提高性能。在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 用于浮点状态错误报告。以前我们有一个中断的默认值,它有时不会报告下溢、溢出和无效的浮点操作。现在我们可以支持像AlpineLinux这样的非glibc发行版,只要它们发行 fenv.h .

加速比 np.block 对于大型阵列

大数组(大于 512 * 512 )现在使用一种基于将数据直接复制到结果数组的适当切片的阻塞算法。这导致这些大型阵列的速度显著加快,尤其是在沿二维以上的方向阻塞的阵列上。

arr.ctypes.data_as(...) 保留对arr的引用

以前,调用者负责在指针的生命周期内保持数组的活动状态。

加速比 np.take 对于只读数组

实施 np.take 当源数组的 writeable 标志设置为 False .

为更多函数支持类似路径的对象

这个 np.core.records.fromfile 功能现在支持 pathlib.Path 以及文件对象之外的其他类似路径的对象。而且, np.load 当使用内存映射时,函数现在还支持类似路径的对象 (mmap_mode 关键字参数)。

在约简过程中UFUNC身份的更好行为

通用函数有一个 .identity.reduce 在空轴上调用。

从这个版本开始,逻辑二进制UFUNC, logical_andlogical_orlogical_xor 现在有 identity 类型S bool ,以前的类型 int . 这将恢复1.14获取 bool 当使用这些ufunc减少空对象数组时,同时保持1.15的获取行为 int 当用类似于 addmultiply .

此外, logaddexp 现在的身份是 -inf ,允许对空序列调用它,以前不能调用。

多亏了新的 PyUFunc_FromFuncAndDataAndSignatureAndIdentity ,它现在允许任意值用作标识。

改进了从CTypes对象的转换

Numpy始终支持从 ctypes 并将其转换为数组或数据类型,但仅对更简单的类型正确执行。在本版本中,此警告已解除-现在:

  • 这个 _pack_ 属性 ctypes.Structure ,用于模拟C __attribute__((packed)) 是值得尊敬的。

  • 保留所有ctypes对象的endianness

  • ctypes.Union 支持

  • 不可表示的构造引发异常,而不是产生危险的错误结果:

    • 位域不再解释为子数组

    • 指针不再替换为指向的类型

一个新的 ndpointer.contents 成员

这与 .contents 常规CTypes数组的成员,并可用于构造 np.array 指针内容周围。这替代了 np.array(some_nd_pointer) 在1.15停止工作。作为这一变化的副作用, ndpointer 现在支持具有重叠字段和填充的数据类型。

matmul is now a ufunc

numpy.matmul 现在是一个ufunc,这意味着函数和 __matmul__ 操作员现在可以被覆盖 __array_ufunc__ . 它的实施也发生了变化。它使用与 numpy.dot 确保大型矩阵的性能相似。

开始和停止数组 linspacelogspacegeomspace

这些函数过去仅限于标量的停止和开始值,但现在可以采用数组,这些数组将被正确广播,并产生一个预先设置了一个轴的输出。这可用于获得点集之间的线性插值点。

通过附加服务扩展CI

由于提供以下服务的公司,我们现在使用额外的免费CI服务:

  • 通过codecov.io进行codecoverage测试

  • 通过shippable.com进行ARM测试

  • 在Azure管道上进行额外的测试运行

除了我们继续使用Travis、Appveyor(用于车轮)和LGTM之外,

变化

比较ufuncs现在将出错,而不是返回notimplemented

以前,比较ufunc,如 np.equal 会回来 NotImplemented if their arguments had structured dtypes, to help comparison operators such as ``_ _ eq“处理这些问题。这不再需要,因为相关的逻辑已经转移到比较运算符上了(这样就可以继续返回 NotImplemented 如果需要的话)。因此,与所有其他UFUNC一样,比较UFUNC现在将在结构化数据类型上出错。

现在,正数将对非数值数组发出反预测警告。

以前, +array 无条件返回副本。现在,它将提高 DeprecationWarning 如果数组不是数字(即,如果 np.positive(array) 提高 TypeError . 为了 ndarray 覆盖默认值的子类 __array_ufunc__ 实施 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中引入的代码的一部分, float32float64 在中遇到NaN时设置无效的浮点状态 numpy.maximumnumpy.minimum ,当使用SSE2语义时。这引起了 RuntimeWarning 有时被发射。在1.15中,我们修正了导致警告变得更加明显的不一致。现在不会发出警告。

umath和多阵列C扩展模块合并为一个模块

两个模块根据 NEP 15 . 以前 np.core.umathnp.core.multiarray 是独立的c扩展模块。它们现在是单个的python包装器 np.core/_multiarray_math C扩展模块。

getfield 有效性检查扩展

numpy.ndarray.getfield 现在检查dtype和offset参数以防止访问无效的内存位置。

numpy函数现在支持覆盖 __array_function__

numpy有一种新的实验机制,通过定义一个 __array_function__ 方法,如中所述 NEP 18 .

默认情况下,此功能尚未启用,但已发布以方便潜在用户进行实验。有关设置适当环境变量的详细信息,请参阅NEP。我们预计numpy 1.17版本将在默认情况下启用覆盖,由于用C编写的新实现,这也将更具性能。

无法设置基于只读缓冲区的数组 writeable

我们现在不允许设置 writeable 在从创建的数组上标记为true fromstring(readonly-buffer) .