Numpy 1.12.0发行说明

这个版本支持python 2.7和3.4-3.6。

集锦

numpy 1.12.0版本包含大量的修复和改进,但很少有比其他版本更突出的版本。这使得挑选突出部分有些武断,但以下内容可能会引起特别关注,或者指出可能会产生未来后果的领域。

  • 操作顺序 np.einsum 现在可以优化为大速度改进。

  • 新的 signature 参数 np.vectorize 用于核心尺寸的矢量化。

  • 这个 keepdims 参数被添加到许多函数中。

  • 用于测试警告的新上下文管理器

  • 支持numpy.distutils中的blis

  • 对Pypy的支持有很大改进(尚未完成)

下降支座

  • 对python 2.6、3.2和3.3的支持已被放弃。

附加支持

  • 增加了对PYPY 2.7 v5.6.0的支持。未完成时 updateifcopy 尚不支持),这是Pypy的C-API兼容层的里程碑。

生成系统更改

  • 将保留库顺序,而不是重新排序以匹配目录的顺序。

贬抑

Ndarray对象的分配 data 属性

如GH-7083所指出的,分配“data”属性是一种固有的不安全操作。这种能力将在未来被移除。

中num属性的int强制转换不安全 linspace

np.linspace 当num不能安全地解释为整数时,现在引发deprecationwarning。

位宽度参数不足 binary_repr

如果传入了“width”参数 binary_repr 它不足以表示基2(正)或2的补码(负)形式中的数字,该函数用于静默地忽略参数,并使用所讨论形式所需的最小位数返回表示。从用户的角度来看,这种行为现在被认为是不安全的,并且在将来会引发错误。

未来变化

  • 在1.13中,除了 NAT != NAT 这是真的。简而言之,Nat的行为就像Nan

  • 1.13 np.average 将保留子类,以匹配大多数其他numpy函数(如np.mean)的行为。特别是,这意味着返回标量的调用可能会返回一个0-D子类对象。

结构化数组的多字段操作

在1.13中,涉及多个字段的结构化数组的行为将以两种方式发生变化:

首先,用多个字段(例如, arr[['f1', 'f3']] )将视图返回到1.13中的原始数组中,而不是一个副本。注意,返回的视图将具有与原始数组中的中间字段相对应的额外填充字节,这与1.12中的副本不同,后者将影响代码,如 arr[['f1', 'f3']].view(newdtype) .

其次,对于numpy版本1.6到1.12,结构化数组之间的赋值“按字段名称”发生:目标数组中的字段设置为源数组中同名的字段,或者如果源没有字段,则设置为0::

>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
      dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')])

在1.13中,分配将改为“按位置”:目的地的第n个字段将设置为源的第n个字段,而不管字段名如何。旧行为可以通过在分配前使用索引对字段重新排序来获得,例如, b[['x', 'y']] = a[['y', 'x']] .

兼容性说明

弃用警告错误

  • 带浮动上升的索引 IndexError ,例如 [0,0] .

  • 使用非整数数组类提升进行索引 IndexError ,例如, a['1', '2']

  • 使用多个省略号进行索引引发 IndexError ,例如, a[..., ...] .

  • 用作索引值的非整数提升 TypeError ,例如,在 reshapetake ,并指定减少轴。

未来走向改变的行为

  • np.full 现在,如果没有给定dtype,则返回填充值的dtype数组,而不是默认为float。

  • np.average 如果参数是ndarray的子类,将发出警告,因为子类将从1.13开始保留。(见未来变化)

power** 将整数幂的错误提升为负整数幂

前面的行为取决于是否涉及numpy标量整数或numpy整数数组。

对于数组

  • 零到负整数幂返回最小整数值。

  • 负整数幂的1,-1都返回了正确的值。

  • 其余整数在升序为负整数幂时返回零。

标量

  • 零到负整数幂返回最小整数值。

  • 负整数幂的1,-1都返回了正确的值。

  • 剩余的整数有时返回零,有时根据整数类型组合返回正确的浮点。

所有这些案例现在都提出了 ValueError 除了那些常见类型为float的整数组合,例如uint64和int8。人们认为简单的规则是最好的方法,而不是对整数单位有特殊的例外。如果你需要负的力量,使用不精确的类型。

默认为放松步幅检查

这将对假定为 F_CONTIGUOUSC_CONTIGUOUS 是互斥的,可以设置为确定现在两者都是的数组的默认顺序。

这个 np.percentile “中点”插值法用于精确指数

“中点”插补器现在给出的结果与“较低”和“较高”的结果相同。以前的行为'lower'+0.5是固定的。

keepdims Kwarg传递给用户类方法

numpy函数 keepdims 现在,Kwarg将值传递给Ndarray子类上的相应方法。以前 keepdims 关键字将被静默删除。这些函数现在具有以下行为:

  1. 如果用户不提供 keepdims ,没有向基础方法传递关键字。

  2. 任何用户提供的值 keepdims 作为关键字参数传递给方法。

如果方法不支持 keepdims Kwarg和用户明确传递 keepdims .

以下功能已更改: sumproductsometruealltrueanyallamaxaminprodmeanstdvarnanminnanmaxnansumnanprodnanmeannanmediannanvarnanstd

bitwise_and 身份已更改

以前的身份是1,现在是-1。有关更多说明,请参见改进中的条目。

当遇到未屏蔽的无效值时,中间值发出警告并返回NaN

类似于未屏蔽中值 ma.median 现在发出运行时警告并返回 NaN 在切片中 NaN 是存在的。

更大的一致性 assert_almost_equal

scalars的精度检查已更改为与数组的精度检查相匹配。现在是:

abs(actual - desired) < 1.5 * 10**(-decimal)

请注意,这比以前记录的要宽松,但与中使用的以前的实现一致。 assert_array_almost_equal . 由于实现的变化,一些非常微妙的测试可能会失败,而这在以前没有失败过。

NoseTester 测试期间警告的行为

什么时候? raise_warnings="develop" 如果给出,所有未捕获的警告现在将被视为测试失败。以前只有选定的被提升。在与默认的python设置类似的测试周期中,将显示一次未捕获或引发的警告(主要是在发布模式下)。

assert_warnsdeprecated 装饰更具体

这个 assert_warns 函数和上下文管理器现在更特定于给定的警告类别。这种增加的特异性导致它们根据外部警告设置进行处理。这意味着,如果在上下文之外给出错误的类别警告并忽略,则不会发出警告。另外,特异性的增加可能意味着错误忽略的警告将被显示或提出。另请参见新的 suppress_warnings 上下文管理器。同样的情况也适用于 deprecated 装饰者。

计算机辅助编程接口

没有变化。

新特点

的可写关键字参数 as_strided

np.lib.stride_tricks.as_strided 现在有一个 writeable 关键字参数。如果不希望对返回的数组执行写操作,以避免意外的不可预测的写操作,则可以将其设置为false。

axes keyword argument for rot90

这个 axes 中的关键字参数 rot90 确定数组在其中旋转的平面。它默认为 axes=(0,1) 和原来的功能一样。

广义的 flip

flipudfliplr 沿轴=0和轴=1分别反转数组元素。新增 flip 函数沿任意给定轴反转数组元素。

  • np.count_nonzero 现在有一个 axis 参数,允许在非平面数组对象上生成非零计数。

BLIS支持 numpy.distutils

现在支持根据BLIS库提供的BLAS实现进行构建。见 [blis] 段在 site.cfg.example (在numpy repo或源分布的根目录中)。

钩子 numpy/__init__.py 运行特定于分发的检查

numpy的二进制分布可能需要在numpy初始化期间运行特定的硬件检查或加载特定的库。例如,如果我们使用需要SSE2指令的BLAS库分发numpy,我们希望检查运行numpy的计算机是否具有SSE2,以便给出信息性错误。

添加钩子 numpy/__init__.py 导入一个 numpy/_distributor_init.py 在标准numpy源文件中保持为空(bar a docstring)的文件,但可以被进行numpy二进制分发的人覆盖。

新的nan函数 nancumsumnancumprod 补充

南函数 nancumsumnancumprod 已添加到计算中 cumsumcumprod 忽略了奶奶。

np.interp 现在可以插入复杂值

np.lib.interp(x, xp, fp) 现在允许插入数组 fp 复杂的,将插入 complex128 精度。

新的多项式评价函数 polyvalfromroots 补充

新功能 polyvalfromroots 从多项式的根计算给定点的多项式。这对于高阶多项式很有用,因为在机器精度下,将其扩展为多项式系数是不准确的。

新建数组创建函数 geomspace 补充

新功能 geomspace 生成几何序列。它类似于 logspace ,但直接指定启动和停止: geomspace(start, stop) 行为与 logspace(log10(start), log10(stop)) .

用于测试警告的新上下文管理器

新的上下文管理器 suppress_warnings 已添加到测试实用程序。此上下文管理器旨在帮助可靠地测试警告。特别是可靠地过滤/忽略警告。在3.4.x之前的python版本中使用“忽略”过滤器忽略警告会很快导致这些(或类似的)警告无法可靠地测试。

上下文管理器允许过滤(以及记录)类似于 catch_warnings 但允许更容易的特异性。另外,打印尚未筛选或嵌套上下文管理器的警告将按预期工作。此外,可以将上下文管理器用作修饰器,当多个测试需要隐藏同一个警告时,这种修饰器很有用。

新的屏蔽数组函数 ma.convolvema.correlate 补充

这些函数包装了非屏蔽版本,但通过屏蔽值传播。有两种不同的传播模式。默认值会导致屏蔽值用屏蔽污染结果,但其他模式仅在没有其他选择时输出屏蔽。

新的 float_power ufunc

新的 float_power ufunc就像 power 除所有计算外,函数的最小精度为float64。关于如何将整数处理为负整数幂的 NumPy 邮件列表进行了长时间的讨论,一个流行的建议是 __pow__ 操作员应始终返回至少float64精度的结果。这个 float_power 函数实现该选项。注意,它不支持对象数组。

np.loadtxt 现在支持单个整数作为 usecol 论点

而不是使用 usecol=(n,) 要读取文件的第n列,现在允许使用 usecol=n . 此外,当将非整数作为列索引传递时,错误消息对用户更为友好。

改进的自动仓位估计 histogram

将“Doane”和“sqrt”估计量添加到 histogram 通过 bins 参数。增加了对范围受限柱状图的支持和自动bin估计。

np.roll 现在可以同时滚动多个轴

这个 shiftaxis 论据 roll 现在相互广播,并且每个指定轴都相应地移动。

这个 __complex__ 已为ndarrays实现方法

调用 complex() 在一个大小为1的数组上,现在将强制转换为一个Python复杂体。

pathlib.Path 现在支持的对象

标准 np.loadnp.savenp.loadtxtnp.savez 和类似的功能现在可以 pathlib.Path 对象作为参数,而不是文件名或打开文件对象。

新的 bits 的属性 np.finfo

这使得 np.finfo 符合 np.iinfo 已经有了这个属性。

新的 signature 参数 np.vectorize

此参数允许以numpy的样式向量化具有核心维度的用户定义函数 generalized universal functions . 这允许对更广泛的函数类进行矢量化。例如,结合两个向量生成标量的任意距离度量可以用 signature='(n),(n)->()' . 见 np.vectorize 详细信息。

为整数数组的除法发出py3kwarnings

为了帮助人们将代码库从python 2迁移到python 3,python解释器有一个方便的选项-3,它在运行时发出警告。其中一个警告是整数除法:

$ python -3 -c "2/3"

-c:1: DeprecationWarning: classic int division

在Python3中,新的整数除法语义也适用于numpy数组。对于此版本,numpy将发出类似的警告::

$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"

-c:1: DeprecationWarning: numpy: classic int division

numpy.sctypes现在也包括python3上的字节

以前,它在python2上包含str(字节)和unicode,但在python3上只包含str(unicode)。

改进

bitwise_and 身份已更改

前一个标识是1,结果是在使用reduce方法时,除了lsb之外的所有位都被屏蔽。新的标识是-1,它应该在两个补码机器上正常工作,因为所有的位都将设置为1。

通用UFUNC现在将解锁GIL

包括大多数linalg模块在内的通用ufuncs现在将解锁python全局解释器锁。

高速缓存 np.fft 现在以总大小和项目计数为界限

高速缓存 np.fft 这就加速了同样长度的连续快速傅立叶变换,不再是无界增长。它们已被替换为LRU(最近使用最少的)缓存,如果达到内存大小或项目计数限制,这些缓存将自动收回不再需要的项目。

改进了零宽度字符串/unicode数据类型的处理

修复了几个明确禁止使用零宽度字符串数据类型的数组的接口(即 dtype('S0')dtype('U0') 并修复了一些未正确处理此类数据类型的错误。特别是,改变了 ndarray.__new__ 不隐式转换 dtype('S0')dtype('S1') (对于Unicode也是如此)创建新数组时。

用avx2矢量化的整数ufuncs

如果CPU在运行时支持它,那么基本整数ufunc现在使用avx2指令。此功能当前仅在使用gcc编译时可用。

操作顺序优化 np.einsum

np.einsum 现在支持 optimize 优化收缩顺序的论点。例如, np.einsum 将完成链点示例 np.einsum(‘ij,jk,kl->il’, a, b, c) 在一个单一的通道中 N^4 然而,当 optimize=True np.einsum 将创建一个中间数组以将此缩放比例减少到 N^3 或有效地 np.dot(a, b).dot(c) . 中间张量的使用,以减少比例已应用于一般的einsum和符号。见 np.einsum_path 了解更多详细信息。

QuickSort已改为IntroSort

流沙式的 np.sortnp.argsort 现在是一个IntroSort,它是常规的QuickSort,但是在没有足够的进展时会变为Heapsort。这将保留良好的快速排序性能,同时将最坏情况下的运行时从 O(N^2)O(N*log(N)) .

ediff1d 改进了性能和子类处理

EDIF1D函数使用数组代替简单迭代器进行减法运算。当“开始”或“结束”不是“无”时,执行减法以消除复制操作。一个副作用是某些子类处理得更好,即astropy.quantity,因为创建、包装完整的数组,然后设置开始和结束值,而不是使用concatenate。

提高的精度 ndarray.mean 对于float16阵列

为了提高精度,现在在float32中计算float16阵列的平均值。这在诸如theano这样的包装中应该很有用,因为float16的精度足够,而且其较小的占地面积是可取的。

变化

现在使用fromNumeric.py中的关键字参数调用所有类似数组的方法。

在内部,fromNumeric.py中的许多类似数组的方法都是使用位置参数调用的,而不是像外部签名那样使用关键字参数。这导致下游“熊猫”类库出现了一个与“numpy”兼容的问题。现在,这个模块中所有类似数组的方法都用关键字参数来调用。

对np.memmap对象的操作在大多数情况下返回numpy数组

以前对memmap对象的操作会错误地返回memmap实例,即使结果实际上不是memmapped。例如, arr + 1arr + arr 将返回memmap实例,尽管输出数组中没有内存是memmapped。版本1.12从这些操作返回普通的numpy数组。

此外,还减少了memmap(例如 .sum(axis=None )现在返回numpy标量而不是0d memmap。

叠加警告级别增加

基于python的警告的stacklevel增加了,因此大多数警告都会报告用户代码中有问题的行,而不是给出警告本身的行。现在测试stacklevel的传递,以确保新的警告将收到 stacklevel 参数。

这将导致对每个有问题的用户代码行或用户模块显示一次带有“默认”或“模块”筛选器的警告,而不是只显示一次。在3.4之前的Python版本中,这可能会导致出现以前被错误忽略的警告,这可能会让人感到惊讶,尤其是在测试套件中。