Numpy 1.17.0发行说明

这个NumPy版本包含了许多新特性,这些特性应该可以显著提高它的性能和实用性,请参阅下面的要点以获取摘要。支持的Python版本是3.5-3.7,注意python2.7已经被删除。python3.8b2应该可以与已发布的源代码包一起使用,但是没有未来的保证。

下游开发人员应该使用Cython>=0.29.11来支持python3.8和OpenBLAS>=3.7(目前尚未推出),以避免Skylake体系结构出现问题。为了避免这些问题,PyPI上的numpywheels是从OpenBLAS开发分支构建的。

集锦

  • 一种新的可扩展 random 模块以及四个可选 random number generators 并增加了设计用于并行进程的改进种子。当前可用的位生成器包括 MT19937PCG64PhiloxSFC64 . 请参见下面的“新功能”下。

  • Numpy的 FFT 实现从fftpack更改为pocketft,从而实现更快、更精确的转换,并更好地处理素数长度的数据集。请参见下面的“改进”部分。

  • 新的基数排序和timsort排序方法。目前无法选择要使用的。它们硬连接到数据类型,并在 stablemergesort 作为方法传递。请参见下面的“改进”部分。

  • 现在默认情况下可以重写numpy函数,请参见 __array_function__ 下面。

新功能

贬抑

numpy.polynomial functions warn when passed float in place of int

此模块中以前的功能将接受 float 如果这些值是整数 (1.02.0 等)。为了与numpy的其余部分保持一致,现在不赞成这样做,并且在将来将提高 TypeError .

类似地,传递一个float-like 0.5 代替整数现在将引发 TypeError 而不是上一个 ValueError .

贬低 numpy.distutils.exec_commandtemp_file_name

这些函数的内部使用已经过重构,有更好的替代方法。替换 exec_command 具有 subprocess.Popentemp_file_name 具有 tempfile.mkstemp .

C-API包装数组的可写标志

当从C-API创建一个数组来包装指向数据的指针时,我们对数据读写性质的唯一指示就是 writeable 创建期间设置的标志。强迫国旗可写是危险的。将来将无法将可写标志切换到 True 来自python。这种不推荐应该不会影响许多用户,因为以这种方式创建的数组在实践中非常罕见,并且只能通过numpyc-API获得。

numpy.nonzero 不应再在0d数组上调用

行为 numpy.nonzero 在0d数组上使用它是令人惊讶的,几乎总是不正确的。如果旧行为是有意的,那么可以使用 nonzero(atleast_1d(arr)) 而不是 nonzero(arr) . 在未来的版本中,这很可能会引发 ValueError .

写的结果 numpy.broadcast_arrays 将发出警告

一般 numpy.broadcast_arrays 返回一个具有内部重叠的可写数组,使写入不安全。未来的版本将设置 writeable 旗到 False ,并要求用户手动将其设置为 True 如果他们确定那是他们想做的。现在写入它将发出一个带有设置 writeable 旗帜 True . 请注意,如果要在设置标志之前检查它,您会发现它已经是了 True . 但是,显式地设置它,就像在将来的版本中需要做的那样,会清除一个用于生成弃用警告的内部标志。为了帮助减轻困惑,一个额外的 FutureWarning 将在访问 writeable 船旗国澄清矛盾。

请注意,对于C端缓冲区协议,除非请求可写缓冲区,否则这样的数组将立即返回只读缓冲区。如果请求一个可写缓冲区,将给出警告。使用cython时 const 限定符应该与这样的数组一起使用以避免警告(例如。 cdef const double[::1] view

未来变化

在未来的版本中,数据类型中的Shape-1字段不会折叠为标量

当前,指定为 [(name, dtype, 1)]"1type" 被解释为标量场(即,与 [(name, dtype)][(name, dtype, ()] ). 这现在引发了一个FutureWarning;在将来的版本中,它将被解释为shape-(1,)字段,即与 [(name, dtype, (1,))]"(1,)type" (符合 [(name, dtype, n)] / "ntype" 具有 n>1 ,这已经相当于 [(name, dtype, (n,)] / "(n,)type"

兼容性说明

float16 次正态舍入

从不同的浮点精度到 float16 在某些边缘情况下使用了不正确的圆角。这意味着在极少数情况下,次正常结果现在将向上取整,而不是向下取整,从而更改结果的最后一位(ULP)。

使用divmod时有符号零

从版本开始 1.12.0 ,当使用不正确的numpy时返回零 divmodfloor_divide 结果为零时的函数。例如::

>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])

使用此版本,结果将正确返回为带正号的零:

>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

MaskedArray.mask 现在返回掩码的视图,而不是掩码本身

返回掩码本身是不安全的,因为它可能会在适当的位置被重塑,这将违反对掩码数组代码的期望。行为 mask 现在符合 data ,它还返回一个视图。

仍然可以使用访问底层掩码 ._mask 如果需要的话。包含 assert x.mask is not y.mask 或类似的将需要更新。

不查找 __buffer__ 属性在 numpy.frombuffer

仰视 __buffer__ 属性在 numpy.frombuffer 未登记且功能不正常。此代码已被删除。如果需要,使用 frombuffer(memoryview(obj), ...) 相反。

out is buffered for memory overlaps in take, choose, put

如果提供了这些函数的out参数,并且该参数的内存与其他参数重叠,那么现在将对其进行缓冲,以避免顺序相关的行为。

加载时取消勾选需要显式选择加入

功能 load, and lib.format.read_array take an allow_pickle keyword which now defaults to False in response to CVE-2019-6446 .

旧随机模中随机流的潜在变化

由于应用程序中的错误 log 对于随机浮点数,从 betabinomiallaplacelogisticlogseriesmultinomial 如果A 0 是在底层生成的 MT19937 随机流。有一个 1 在里面 10^{{53}} 发生这种情况的可能性,因此任何给定种子的流更改的概率都非常小。如果 0 在基础生成器中遇到,则生成不正确的值(或者 numpy.infnumpy.nan )现在已删除。

i0 现在总是返回与输入形状相同的结果

以前,输出是压缩的,例如,只有一个元素的输入将导致返回一个数组标量,而具有如下形状的输入 (10, 1) 将产生不会针对输入广播的结果。

注意,我们通常推荐SciPy实现而不是numpy实现:它是一个用C编写的合适的ufunc,并且比C快一个数量级。

can_cast 不再假定允许所有不安全的铸造

以前, can_cast 返回 True 几乎所有的输入 casting='unsafe' ,即使在无法进行转换的情况下,例如从结构化数据类型转换为常规数据类型。这是固定的,使其更符合实际铸造使用,例如 .astype 方法。

ndarray.flags.writeable 可以更频繁地切换到true

在极少数情况下,虽然基数组是可写的,但无法将数组从不可写切换到可写。如果中间产物 ndarray.base 对象是可写的。以前,这个决定只考虑最深的基础对象。但是,在极少数情况下,此对象没有必要的信息。在这种情况下,决不允许切换到可写模式。现在已经修复了。

C API更改

维度或跨步输入参数现在由 npy_intp const*

以前,这些函数参数被声明为更严格的 npy_intp* ,这阻止了调用者传递常量数据。此更改是向后兼容的,但现在允许如下代码:

npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);

新特点

新可扩展 numpy.random 带可选随机数发生器的模块

一种新的可扩展 numpy.random 模块以及四个可选的随机数发生器和改进的种子设计用于并行进程已被添加。当前可用的 Bit GeneratorsMT19937PCG64PhiloxSFC64 . PCG64 是新的默认值 MT19937 为向后兼容而保留。请注意,遗留的随机模块没有更改,现在已冻结,您当前的结果不会更改。更多信息请参见 API change description 而在 top-level view 文档。

烈焰

支持使用libFLAME线性代数包作为LAPACK构建NumPy,实现请参见 libFLAME 有关详细信息。

自定义BLAS检测顺序

distutils 现在使用环境变量(逗号分隔且不区分大小写)来确定BLAS库的检测顺序。默认情况下 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas . 但是,要强制使用OpenBLAS,只需执行以下操作:

NPY_BLAS_ORDER=openblas python setup.py build

强制使用OpenBLAS。这对于安装了MKL但希望尝试不同实现的用户可能会有所帮助。

用户定义的LAPACK检测顺序

numpy.distutils 现在使用环境变量(逗号分隔且不区分大小写)来确定LAPACK库的检测顺序。默认情况下 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack . 但是,要强制使用OpenBLAS,只需执行以下操作:

NPY_LAPACK_ORDER=openblas python setup.py build

强制使用OpenBLAS。这对于安装了MKL但希望尝试不同实现的用户可能会有所帮助。

Timsort和基数排序已经取代了mergesort来实现稳定排序

基数排序和timsort都已经实现,现在被用来代替mergesort。由于需要保持向后兼容性,排序 kind 选项 "stable""mergesort" 根据数组类型的不同,使用实际的排序实现使它们成为彼此的别名。基数排序用于16位或更少的小整数类型,timsort用于其余类型。Timsort在包含已经或即将排序的数据的数据上具有改进的性能,并且在随机数据上执行类似mergesort的操作,并且需要 O(n/2) 工作空间。有关timsort算法的详细信息,请访问 CPython listsort.txt .

packbitsunpackbits 接受一个 order 关键字

这个 order 关键字默认为 big ,并将订购 bits 相应地。为了 'order=big' 3将成为 [0, 0, 0, 0, 0, 0, 1, 1][1, 1, 0, 0, 0, 0, 0, 0] 对于 order=little

unpackbits 现在接受 count 参数

count 允许在前面对将要解包的位数进行子集设置,而不允许在以后重新整形和子集设置,从而使 packbits 操作可逆,开箱少浪费。大于可用位数的计数加零填充。负计数将位从末尾删去而不是从开始计数。无计数实现了解包所有内容的现有行为。

linalg.svdlinalg.pinv 在Hermitian输入上可以更快

这些函数现在接受 hermitian 参数,与添加到 linalg.matrix_rank 1.1.0.

DivMod操作现在支持两个 timedelta64 操作数

DivMod操作员现在处理两个 timedelta64 带类型签名的操作数 mm->qm .

fromfile 现在需要一个 offset 参数

此函数现在需要 offset 对于当前二进制文件(specific-files)的参数。默认为 0 .

新模式“空”用于 pad

此模式将数组填充到所需形状,而不初始化新条目。

浮点标量实现 as_integer_ratio 匹配内置浮子

这将返回(分子、分母)对,可用于构造 fractions.Fraction .

结构化的 dtype 对象可以用多个字段名编制索引

arr.dtype[['a', 'b']] 现在返回一个与 arr[['a', 'b']].dtype ,以符合 arr.dtype['a'] == arr['a'].dtype .

与用字段列表索引的结构化数组的数据类型一样,此数据类型具有相同的属性 itemsize 但只保留字段的一个子集。

这意味着 arr[['a', 'b']]arr.view(arr.dtype[['a', 'b']]) 是等价的。

.npy 文件支持unicode字段名

引入了一个新的3.0格式版本,它支持具有非拉丁1字段名的结构化类型。需要时自动使用。

改进

数组比较断言包括最大差异

来自数组比较测试的错误消息,例如 testing.assert_allclose 现在,除了前面的“不匹配”百分比之外,还包括“最大绝对差”和“最大相对差”。此信息使更新绝对和相对误差公差更容易。

更换基于fftpack的 fft pocketfft库的模块

两种实现都有相同的祖先(Paul N.Swarztrauber的Fortran77 FFTPACK),但是pocketft包含额外的修改,在某些情况下可以提高精度和性能。对于包含大素数因子的FFT长度,pocketfft使用Bluestein算法,该算法保持 O(N log N) 运行时复杂性而不是恶化 O(N*N) 对于素数长度。同时,具有近素数长度的实值fft的精度得到了提高,与复数fft相当。

进一步改进 ctypes 支持 numpy.ctypeslib

一个新的 numpy.ctypeslib.as_ctypes_type 已添加函数,该函数可用于转换 dtype 最好的猜测 ctypes 类型。多亏了这个新功能, numpy.ctypeslib.as_ctypes 现在支持更广泛的数组类型,包括结构、布尔值和非本机端序的整数。

numpy.errstate 现在也是一个函数装饰器

目前,如果您有如下功能:

def foo():
    pass

你想把整个东西包起来 errstate ,你必须这样重写:

def foo():
    with np.errstate(...):
        pass

但是有了这个改变,你可以:

@np.errstate(...)
def foo():
    pass

从而节省一个缩进级别

numpy.expnumpy.log 加快float32实现

float32实现 explog 现在可以从运行时检测到的AVX2/AVX512指令集中获益。 exp 最大ulp误差为2.52和 log 最大ulp错误或3.83。

提高性能 numpy.pad

在大多数情况下,通过使用所需的填充形状填充预分配数组,而不是使用串联,可以提高函数的性能。

numpy.interp 更有力地处理无穷大

在某些情况下 interp 以前会回来的 nan ,它现在返回一个适当的无穷大。

Pathlib支持 fromfiletofilendarray.dump

fromfilendarray.ndarray.tofilendarray.dump 现在支持 pathlib.Path 的类型 file/fid 参数。

专业的 isnanisinfisfinite bool和int类型的ufuncs

布尔和整数类型无法存储 naninf 值,这使我们能够提供比以前的方法快250倍的专用ufunc。

isfinite 支架 datetime64timedelta64 类型

以前, isfinite 用来养一个 TypeError 在这两种类型上使用。

添加到的新关键字 nan_to_num

nan_to_num 现在接受关键字 nanposinfneginf 允许用户定义值来替换 nan ,正面和负面 np.inf 值。

由分配的过大数组引起的内存错误更具描述性

内存错误的原因通常是不正确的广播,这会导致非常大和不正确的形状。错误消息现在包含此形状,以帮助诊断故障原因。

floorceiltrunc 现在尊重内置的魔法方法

这些ufunc现在称之为 __floor____ceil____trunc__ 方法,使它们与 decimal.Decimalfractions.Fraction 物体。

quantile 现在开始工作 fraction.Fractiondecimal.Decimal 物体

一般来说,这样可以更优雅地处理对象数组,如果使用精确的算术类型,则可以避免浮点运算。

在中支持对象数组 matmul

现在可以使用 matmul (或 @ 运算符)对象数组。例如,现在可以这样做:

from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a

变化

median and percentile family of functions no longer warn about nan

numpy.mediannumpy.percentilenumpy.quantile 用来发射 RuntimeWarning 当遇到 nan . 因为他们返回 nan 值,警告是多余的,已被删除。

timedelta64 % 0 behavior adjusted to return NaT

模运算与二 np.timedelta64 操作数现在返回 NaT 如果除以零,而不是返回零

numpy函数现在总是支持覆盖 __array_function__

numpy现在总是检查 __array_function__ 在非numpy数组上实现numpy函数重写的方法,如中所述 NEP 18 . 如果设置了适当的环境变量,则可以使用numpy 1.16进行测试,但现在始终启用该功能。

lib.recfunctions.structured_to_unstructured 不挤压单场视图

以前 structured_to_unstructured(arr[['a']]) 会产生一个与 structured_to_unstructured(arr[['a', b']]) . 这是偶然的。旧的行为可以保留下来 structured_to_unstructured(arr[['a']]).squeeze(axis=-1) 或者更简单地说, arr['a'] .

clip 现在在引擎盖下使用一个ufunc

这意味着通过 descr->f->fastclip 已弃用-它们应该改用ufunc注册机制,附加到 np.core.umath.clip UFUNC

这也意味着 clip 接受 wherecasting 参数,并且可以用 __array_ufunc__ .

这种变化的结果是老年人的一些行为 clip 已被否决:

  • 经过 nan 意思是“不要夹”作为一个或两个界限。无论如何,这并不是在所有情况下都有效,通过传递适当符号的无穷大可以更好地处理。

  • out 参数已通过。使用 casting="unsafe" 将使此警告静音。

此外,还有一些行为改变的极端情况:

  • 衬垫 max < min 已更改为跨数据类型更加一致,但不应依赖。

  • 标量 minmax 像参加其他联合国大学一样参加晋升规则。

__array_interface__ 补偿现在按记录工作

接口可以使用 offset 错误忽略的值。

中的Pickle协议 savez 设置为3表示 force zip64 旗帜

savez 没有使用 force_zip64 标志,将存档大小限制为2GB。但是使用这个标志需要我们使用pickle协议3来编写 object 数组。使用的协议被提升到3,这意味着Python2将无法读取存档文件。

用不存在的字段索引的结构化数组 KeyErrorValueError

arr['bad_field'] 关于结构化类型 KeyError ,以符合 dict['bad_field'] .