这个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__ 下面。
__array_function__
这个 matmul 函数现在是一个ufunc。这提供了更好的性能,并允许重写 __array_ufunc__ .
matmul
__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
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.typeNA 和 numpy.core.sctypeNA 已弃用。它们是有缺陷的,没有文档记录,将在1.18版本中删除。改用“numpy.sctypedict”。
这个 numpy.asscalar 函数已弃用。它是更强大的 numpy.ndarray.item ,未测试,对scalars失败。
numpy.asscalar
numpy.ndarray.item
这个 numpy.set_array_ops 和 numpy.get_array_ops 函数已弃用。作为一部分 NEP 15 ,它们与C-API函数一起被弃用。 PyArray_SetNumericOps 和 PyArray_GetNumericOps . 想要覆盖内置UFUNC中的内部循环函数的用户应该使用 PyUFunc_ReplaceLoopBySignature .
PyArray_SetNumericOps
PyArray_GetNumericOps
PyUFunc_ReplaceLoopBySignature
这个 numpy.unravel_index 关键字参数 dims 已弃用,请使用 shape 相反。
numpy.unravel_index
dims
shape
这个 numpy.histogram normed 参数已弃用。之前已弃用,但未发出警告。
numpy.histogram
normed
这个 positive 操作人员 (+ )不推荐使用非数值数组。详情见下文。
positive
+
不推荐将迭代器传递给堆栈函数
nat比较现在返回 False 在没有警告的情况下,完成从numpy 1.11开始的折旧周期。
False
np.lib.function_base.unique 被移除,完成从numpy 1.4开始的折旧周期。使用 numpy.unique 相反。
np.lib.function_base.unique
numpy.unique
多字段索引现在返回视图而不是副本,完成从numpy 1.7开始的折旧周期。之前在numpy 1.14中尝试过更改,但现在恢复。
np.PackageLoader 和 np.pkgload 已被删除。这些在1.10中被否决,没有测试,并且似乎在1.15中不再有效。
np.PackageLoader
np.pkgload
numpy 1.17将放弃对python 2.7的支持。
在Windows上,用于运行f2py的已安装脚本现在是 .exe 文件而不是 *.py 文件,应从命令行运行为 f2py 每当 Scripts 目录在路径中。运行 f2py 作为模块 python -m numpy.f2py [...] 在任何版本的numpy中都可以不修改路径。
.exe
*.py
f2py
Scripts
python -m numpy.f2py [...]
与NaN的行为一致,除了用datetime64或timedelta64 nat(“非时间”)值进行不等式检查之外的所有比较现在都始终返回 False ,与nat的不平等检查现在总是返回 True . 这包括两个nat值之间的比较。为了与旧行为兼容,请使用 np.isnat 显式检查NAT或将datetime64/timedelta64数组转换为 .astype(np.int64) 在进行比较之前。
True
np.isnat
.astype(np.int64)
现在,复杂类型的内存对齐方式与由两个浮点值组成的C结构相同,而在它等于类型大小之前。对于许多用户(例如在x64/unix/gcc上),这意味着complex64现在是4字节对齐,而不是8字节对齐。一个重要的结果是,对齐的结构化数据类型现在可能具有不同的大小。例如, np.dtype('c8,u1', align=True) 以前的itemsize是16(在x64/gcc上),现在是12。
np.dtype('c8,u1', align=True)
更详细地说,complex64类型现在与C结构具有相同的对齐方式。 struct {{float r, i;}} ,根据用于编译numpy的编译器,同样也适用于complex128和complex256类型。
struct {{float r, i;}}
len(np.mgrid) 和 len(np.ogrid) 现在被认为是无稽之谈 TypeError .
len(np.mgrid)
len(np.ogrid)
TypeError
np.unravel_index
以前,只有 dims 关键字参数被接受,用于指定要用于展开的数组的形状。 dims 仍受支持,但现在已弃用。
为具有多个字段的结构化数组编制索引,例如, arr[['f1', 'f3']] ,将视图返回到原始数组而不是副本中。与以前不同,返回的视图通常具有与原始数组中的中间字段相对应的额外填充字节,这将影响代码,例如 arr[['f1', 'f3']].view('float64') . 从numpy 1.7开始就计划进行此更改。命中此路径的操作已发出 FutureWarnings 从那时起。附加的 FutureWarnings 关于这一变化,在1.12中增加了。
arr[['f1', 'f3']]
arr[['f1', 'f3']].view('float64')
FutureWarnings
为了帮助用户更新他们的代码以应对这些更改,已经向 numpy.lib.recfunctions 安全允许此类操作的模块。例如,上面的代码可以替换为 structured_to_unstructured(arr[['f1', 'f3']], dtype='float64') . 请参见 user guide _.
numpy.lib.recfunctions
structured_to_unstructured(arr[['f1', 'f3']], dtype='float64')
这个 NPY_FEATURE_VERSION 由于添加了:
NPY_FEATURE_VERSION
PyUFuncObject.core_dim_flags
PyUFuncObject.core_dim_sizes
PyUFuncObject.identity_value
PyUFunc_FromFuncAndDataAndSignatureAndIdentity
histogram
这种方法 (bins='stone' )优化bin数是Scott规则的概括。斯科特法则假定分布近似正态,而 ISE 是一种基于交叉验证的非参数化方法。
bins='stone'
max_rows
np.loadtxt
新关键词 max_rows 在里面 numpy.loadtxt 设置要在此后读取的内容的最大行数 skiprows ,如 numpy.genfromtxt .
numpy.loadtxt
skiprows
numpy.genfromtxt
np.timedelta64
模(余数)运算符现在支持两个类型的操作数 np.timedelta64 . 操作数可以有不同的单位,返回值将与操作数的类型匹配。
在协议4之前,numpy数组pickle创建了两个被序列化的数据的假副本。使用pickle协议5,以及 PickleBuffer API,现在可以序列化大量的numpy数组,而无需使用带外缓冲区进行任何复制,也无需使用带内缓冲区进行一次复制。对于大型阵列,这会导致峰值内存使用率下降66%。
PickleBuffer
numpy构建不应该再直接与主机shell交互。 exec_command 已被替换为 subprocess.check_output 在适当的情况下。
exec_command
subprocess.check_output
当用于支持它的前端时, Polynomial 实例现在通过 Latex 渲染。当前格式是实验性的,可能会发生更改。
randint
choice
即使不需要绘制元素, np.random.randint 和 np.random.choice 当参数描述空分发时引发错误。这已被修复,例如 np.random.choice([], 0) == np.array([], dtype=float64) .
np.random.randint
np.random.choice
np.random.choice([], 0) == np.array([], dtype=float64)
linalg.lstsq
linalg.qr
linalg.svd
以前,A LinAlgError 当传入空矩阵/空矩阵(行和/或列为零)时将引发。现在返回适当形状的输出。
LinAlgError
这将有助于跟踪问题。
einsum与当前上游工作同步。
numpy.angle
numpy.expand_dims
ndarray
特别是,它们现在适用于屏蔽数组。
NPY_NO_DEPRECATED_API
设置 NPY_NO_DEPRECATED_API 如果值为0,则在使用不推荐使用的numpy API时,将取消当前编译器警告。
np.diff
新克沃斯 prepend 和 append ,允许在差异的两端插入值。类似于 ediff1d . 现在的倒数 cumsum 很容易通过 prepend=0 .
prepend
append
prepend=0
对ARM CPU的支持已经更新,以适应32位和64位的目标,以及大、小端字节顺序。已经解决了AARCH32内存对齐问题。CI测试已经通过shippable.com的服务扩展到包含AARCH64目标。
numpy.distutils 始终重写而不是附加到 LDFLAGS 以及其他类似的用于编译Fortran扩展的环境变量。现在,如果 NPY_DISTUTILS_APPEND_FLAGS 环境变量设置为1,行为将追加。这适用于: LDFLAGS , F77FLAGS , F90FLAGS , FREEFLAGS , FOPT , FDEBUG 和 FFLAGS . 详见GH-11525。
numpy.distutils
通过在通用ufunc的签名中使用数值,可以指示给定函数需要输入或输出具有给定大小的维度。例如,将极角转换为二维笛卡尔单位向量的函数的签名将是 ()->(2) 对于将两个球面角转换为三维单位向量的人来说, (),()->(3) ;对于两个三维向量的叉积来说, (3),(3)->(3) .
()->(2)
(),()->(3)
(3),(3)->(3)
请注意,对于基本函数,这些维与以字母开头的名称表示的变量维没有任何区别;循环仍然传递相应的大小,但现在可以将该大小计为签名中给定的固定大小。
一些函数,特别是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)->() .
(m?,n),(n,p?)->(m?,p?)
(n, 1)
(m, 1)
(..., m)
(1, n)
(1, 1)
()
(m,n),(n,p)->(m,p)
(n),(n,p)->(p)
(m,n),(n)->(m)
(n),(n)->()
np.clip
clip
这个 out 这些函数的参数现在总是测试内存重叠,以避免发生内存重叠时出现损坏的结果。
out
unscaled
cov
np.polyfit
进一步增加了 cov 的参数 np.polyfit 功能。用 cov='unscaled' 协方差矩阵的缩放完全禁用(类似于设置 absolute_sigma=True 在里面 scipy.optimize.curve_fit )这在1/sigma给出权重,sigma是(高斯分布)数据点的(已知)标准误差的情况下是有用的,在这种情况下,未标度矩阵已经是协方差矩阵的正确估计。
cov='unscaled'
absolute_sigma=True
scipy.optimize.curve_fit
这个 help 函数,当应用于数字类型时,例如 numpy.intc , numpy.int_ 和 numpy.longlong ,现在列出该类型的所有别名,区分与平台相关的别名和独立的别名。
help
numpy.intc
numpy.int_
numpy.longlong
__module__
这个 __module__ 大多数numpy函数的属性已经更新,以引用从中访问函数的首选公共模块,而不是恰好定义函数的模块。这将为工具(如ipython)中的函数(而不是 <function 'numpy.core.fromnumeric.sum'> 你现在看到了 <function 'numpy.sum'> .
<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 以避免由于内存碎片整理中的并发问题而导致的性能问题。
我们现在默认使用 fenv.h 用于浮点状态错误报告。以前我们有一个中断的默认值,它有时不会报告下溢、溢出和无效的浮点操作。现在我们可以支持像AlpineLinux这样的非glibc发行版,只要它们发行 fenv.h .
np.block
大数组(大于 512 * 512 )现在使用一种基于将数据直接复制到结果数组的适当切片的阻塞算法。这导致这些大型阵列的速度显著加快,尤其是在沿二维以上的方向阻塞的阵列上。
512 * 512
arr.ctypes.data_as(...)
以前,调用者负责在指针的生命周期内保持数组的活动状态。
np.take
实施 np.take 当源数组的 writeable 标志设置为 False .
writeable
这个 np.core.records.fromfile 功能现在支持 pathlib.Path 以及文件对象之外的其他类似路径的对象。而且, np.load 当使用内存映射时,函数现在还支持类似路径的对象 (mmap_mode 关键字参数)。
np.core.records.fromfile
pathlib.Path
np.load
mmap_mode
通用函数有一个 .identity 当 .reduce 在空轴上调用。
.identity
.reduce
从这个版本开始,逻辑二进制UFUNC, logical_and , logical_or 和 logical_xor 现在有 identity 类型S bool ,以前的类型 int . 这将恢复1.14获取 bool 当使用这些ufunc减少空对象数组时,同时保持1.15的获取行为 int 当用类似于 add 和 multiply .
identity
bool
int
add
multiply
此外, logaddexp 现在的身份是 -inf ,允许对空序列调用它,以前不能调用。
-inf
多亏了新的 PyUFunc_FromFuncAndDataAndSignatureAndIdentity ,它现在允许任意值用作标识。
Numpy始终支持从 ctypes 并将其转换为数组或数据类型,但仅对更简单的类型正确执行。在本版本中,此警告已解除-现在:
ctypes
这个 _pack_ 属性 ctypes.Structure ,用于模拟C __attribute__((packed)) 是值得尊敬的。
_pack_
ctypes.Structure
__attribute__((packed))
保留所有ctypes对象的endianness
ctypes.Union 支持
ctypes.Union
不可表示的构造引发异常,而不是产生危险的错误结果:
位域不再解释为子数组
指针不再替换为指向的类型
ndpointer.contents
这与 .contents 常规CTypes数组的成员,并可用于构造 np.array 指针内容周围。这替代了 np.array(some_nd_pointer) 在1.15停止工作。作为这一变化的副作用, ndpointer 现在支持具有重叠字段和填充的数据类型。
.contents
np.array
np.array(some_nd_pointer)
ndpointer
ufunc
numpy.matmul 现在是一个ufunc,这意味着函数和 __matmul__ 操作员现在可以被覆盖 __array_ufunc__ . 它的实施也发生了变化。它使用与 numpy.dot 确保大型矩阵的性能相似。
numpy.matmul
__matmul__
numpy.dot
linspace
logspace
geomspace
这些函数过去仅限于标量的停止和开始值,但现在可以采用数组,这些数组将被正确广播,并产生一个预先设置了一个轴的输出。这可用于获得点集之间的线性插值点。
由于提供以下服务的公司,我们现在使用额外的免费CI服务:
通过codecov.io进行codecoverage测试
通过shippable.com进行ARM测试
在Azure管道上进行额外的测试运行
除了我们继续使用Travis、Appveyor(用于车轮)和LGTM之外,
以前,比较ufunc,如 np.equal 会回来 NotImplemented if their arguments had structured dtypes, to help comparison operators such as ``_ _ eq“处理这些问题。这不再需要,因为相关的逻辑已经转移到比较运算符上了(这样就可以继续返回 NotImplemented 如果需要的话)。因此,与所有其他UFUNC一样,比较UFUNC现在将在结构化数据类型上出错。
np.equal
以前, +array 无条件返回副本。现在,它将提高 DeprecationWarning 如果数组不是数字(即,如果 np.positive(array) 提高 TypeError . 为了 ndarray 覆盖默认值的子类 __array_ufunc__ 实施 TypeError 传下去了。
+array
DeprecationWarning
np.positive(array)
NDArrayOperatorsMixin
以前, np.lib.mixins.NDArrayOperatorsMixin 没有为python的矩阵乘法运算符实现特殊方法 (@ )现在情况变了 matmul 是一个ufunc,可以使用 __array_ufunc__ .
np.lib.mixins.NDArrayOperatorsMixin
到目前为止, np.polyfit 在协方差矩阵的缩放中使用了非标准因子。也就是说,而不是使用标准 chisq/(M-N) ,它按比例缩放 chisq/(M-N-2) 其中m是数据点的数量,n是参数的数量。该比例与其他拟合程序不一致,例如 scipy.optimize.curve_fit 改为 chisq/(M-N) .
chisq/(M-N)
chisq/(M-N-2)
maximum
minimum
作为1.10中引入的代码的一部分, float32 和 float64 在中遇到NaN时设置无效的浮点状态 numpy.maximum 和 numpy.minimum ,当使用SSE2语义时。这引起了 RuntimeWarning 有时被发射。在1.15中,我们修正了导致警告变得更加明显的不一致。现在不会发出警告。
float32
float64
numpy.maximum
numpy.minimum
两个模块根据 NEP 15 . 以前 np.core.umath 和 np.core.multiarray 是独立的c扩展模块。它们现在是单个的python包装器 np.core/_multiarray_math C扩展模块。
getfield
numpy.ndarray.getfield 现在检查dtype和offset参数以防止访问无效的内存位置。
numpy.ndarray.getfield
numpy有一种新的实验机制,通过定义一个 __array_function__ 方法,如中所述 NEP 18 .
默认情况下,此功能尚未启用,但已发布以方便潜在用户进行实验。有关设置适当环境变量的详细信息,请参阅NEP。我们预计numpy 1.17版本将在默认情况下启用覆盖,由于用C编写的新实现,这也将更具性能。
我们现在不允许设置 writeable 在从创建的数组上标记为true fromstring(readonly-buffer) .
fromstring(readonly-buffer)