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 的支持.虽然尚未完成(nditer
updateifcopy尚不支持),但这是 PyPy 的 C-API 兼容层的一个里程碑.
构建系统更改#
库顺序被保留,而不是被重新排序以匹配目录的顺序.
弃用#
ndarray 对象的 data 属性的赋值#
如 gh-7083 中指出的那样,分配“data”属性本质上是不安全的操作. 这种功能将在未来删除.
linspace 中 num 属性的不安全 int 类型转换#
当 num 无法安全地解释为整数时, np.linspace 现在会引发 DeprecationWarning.
binary_repr 的位宽参数不足#
如果传递给 binary_repr 的“width”参数不足以用二进制(正数)或 2 的补码(负数)形式表示该数字,则该函数过去会静默地忽略该参数,并返回使用所需的最少位数表示的形式.从用户的角度来看,这种行为现在被认为是不安全的,并且将来会引发错误.
未来的变化#
在 1.13 中,除了
NAT != NAT(将为 True)之外,NAT 将始终比较为 False. 简而言之,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,例如,a[0, 0.0].使用非整数类数组索引会引发
IndexError,例如,a['1', '2']使用多个省略号索引会引发
IndexError,例如,a[..., ...].非整数用作索引值会引发
TypeError,例如,在reshape,take和指定 reduce 轴时.
对已更改行为的 FutureWarning#
如果未给出 dtype,
np.full现在返回填充值的 dtype 数组,而不是默认为 float.如果参数是 ndarray 的子类,
np.average将发出警告,因为从 1.13 开始将保留该子类.(参见未来变化)
power 和 ** 对整数的负整数次幂引发错误#
先前的行为取决于是否涉及 numpy 标量整数或 numpy 整数数组.
对于数组
零的负整数次幂返回最小整数值.
1 和 -1 的负整数次幂返回正确的值.
其余整数在提升到负整数幂时返回零.
对于标量
零的负整数次幂返回最小整数值.
1 和 -1 的负整数次幂返回正确的值.
其余整数有时返回零,有时返回正确的浮点数,具体取决于整数类型组合.
所有这些情况现在都引发 ValueError ,除了那些公共类型为浮点数的整数组合,例如 uint64 和 int8.人们认为,采用简单的规则是最好的方法,而不是为整数单元设置特殊的例外.如果需要负数幂,请使用非精确类型.
放宽步幅检查是默认设置#
这将对假定 F_CONTIGUOUS 和 C_CONTIGUOUS 是互斥的代码产生一些影响,并且可以设置为确定现在两者都是的数组的默认顺序.
为精确索引修复了 np.percentile “midpoint” 插值方法#
当两者重合时,“midpoint” 插值器现在给出与“lower”和“higher”相同的结果. 修复了先前的“lower”+ 0.5 的行为.
keepdims kwarg 被传递到用户类方法#
接受 keepdims kwarg 的 numpy 函数现在将该值传递给 ndarray 子类上的相应方法. 以前, keepdims 关键字会被默默地删除. 这些函数现在具有以下行为:
如果用户未提供
keepdims,则不会将任何关键字传递给底层方法.任何用户提供的
keepdims值都会作为关键字参数传递给该方法.
如果某个方法不支持 keepdims 关键字参数,但用户显式地传入了 keepdims ,则会引发异常.
以下函数已更改: sum , product , sometrue , alltrue , any , all , amax , amin , prod , mean , std , var , nanmin , nanmax , nansum , nanprod , nanmean , nanmedian , nanvar , nanstd
bitwise_and 恒等更改#
之前的恒等式是 1,现在是 -1.有关更多说明,请参见“改进”中的条目.
当遇到未屏蔽的无效值时, ma.median 会发出警告并返回 nan#
与未屏蔽的中位数类似,屏蔽的中位数 ma.median 现在会在存在未屏蔽的 NaN 的切片中发出 Runtime 警告并返回 NaN .
assert_almost_equal 中更大的一致性#
标量的精度检查已更改为与数组的精度检查相匹配.现在是:
abs(actual - desired) < 1.5 * 10**(-decimal)
请注意,这比以前记录的要宽松,但与 assert_array_almost_equal 中使用的先前实现一致.由于实现中的更改,某些非常精细的测试可能会失败.
测试期间 NoseTester 的警告行为#
当给定 raise_warnings="develop" 时,所有未捕获的警告现在将被视为测试失败.以前仅引发选定的警告.未捕获或引发的警告(主要是在发布模式下)将在测试周期中显示一次,类似于默认的 python 设置.
assert_warns 和 deprecated 装饰器更具体#
assert_warns 函数和上下文管理器现在更具体于给定的警告类别.这种增加的特异性导致它们根据外部警告设置进行处理.这意味着在给出错误的类别警告并在上下文之外被忽略的情况下,可能不会引发任何警告.或者,增加的特异性可能意味着先前被错误地忽略的警告现在将被显示或引发.另请参阅新的 suppress_warnings 上下文管理器. deprecated 装饰器也是如此.
C API#
无更改.
新特性#
as_strided 的可写关键字参数#
np.lib.stride_tricks.as_strided 现在具有一个 writeable 关键字参数.当预计不会对返回的数组进行写入操作时,可以将其设置为 False,以避免意外的不可预测的写入.
rot90 的 axes 关键字参数#
rot90 中的 axes 关键字参数确定数组旋转的平面.它默认为 axes=(0,1) ,与原始函数相同.
广义的 flip#
flipud 和 fliplr 分别反转数组沿 axis=0 和 axis=1 的元素.新添加的 flip 函数反转数组沿任何给定轴的元素.
np.count_nonzero现在具有一个axis参数,允许在不仅仅是展平的数组对象上生成非零计数.
numpy.distutils 中的 BLIS 支持#
现在支持针对 BLIS 库提供的 BLAS 实现进行构建. 请参阅 site.cfg.example 中的 [blis] 部分(位于 numpy 存储库或源发行版的根目录中).
numpy/__init__.py 中的 Hook 用于运行特定于分发的检查#
numpy 的二进制发行版可能需要在 numpy 初始化期间运行特定的硬件检查或加载特定的库. 例如,如果我们正在分发带有需要 SSE2 指令的 BLAS 库的 numpy,我们希望检查运行 numpy 的机器是否确实具有 SSE2,以便给出有用的错误信息.
在 numpy/__init__.py 中添加一个钩子,用于导入一个 numpy/_distributor_init.py 文件,该文件在标准的 numpy 源代码中将保持为空(除了一个文档字符串),但可以被制作 numpy 二进制发行版的人覆盖.
新增 nan 函数 nancumsum 和 nancumprod#
新增 Nan 函数 nancumsum 和 nancumprod ,用于通过忽略 nan 来计算 cumsum 和 cumprod .
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 版本中使用“ignore”过滤器忽略警告,可能会导致这些(或类似的)警告无法得到可靠的测试.
该上下文管理器允许过滤(以及记录)警告,类似于 catch_warnings 上下文,但允许更容易地指定.此外,打印未被过滤的警告或嵌套上下文管理器将按预期工作.此外,可以将上下文管理器用作装饰器,这在多个测试需要隐藏相同的警告时非常有用.
新增 masked array 函数 ma.convolve 和 ma.correlate#
这些函数包装了非屏蔽版本,但通过屏蔽值传播.有两种不同的传播模式.默认模式导致屏蔽值用掩码污染结果,但另一种模式仅在没有其他选择时才输出掩码.
新增 float_power ufunc#
新的 float_power ufunc 类似于 power 函数,只是所有计算都以至少 float64 的精度完成.在 numpy 邮件列表中,关于如何处理整数的负整数幂有一个很长的讨论,一个流行的提议是 __pow__ 运算符总是应该返回至少 float64 精度的结果. float_power 函数实现了这个选项.请注意,它不支持对象数组.
np.loadtxt 现在支持将单个整数作为 usecol 参数#
现在允许使用 usecol=n 来读取文件的第 n 列,而不是使用 usecol=(n,) .此外,当传递非整数作为列索引时,错误消息更加用户友好.
改进了 histogram 的自动 bin 估计器#
通过 bins 参数向 histogram 添加了 ‘doane’ 和 ‘sqrt’ 估计器. 添加了对具有自动 bin 估计的范围限制直方图的支持.
np.roll 现在可以同时滚动多个轴#
roll 的 shift 和 axis 参数现在相互广播,并且每个指定的轴都会相应地移动.
__complex__ 方法已经为 ndarrays 实现#
在大小为 1 的数组上调用 complex() 现在将转换为 python complex.
现在支持 pathlib.Path 对象#
标准的 np.load , np.save , np.loadtxt , np.savez , 和类似函数现在可以使用 pathlib.Path 对象作为参数,而不是文件名或者打开的文件对象.
np.finfo 的新 bits 属性#
这使得 np.finfo 与已经具有该属性的 np.iinfo 保持一致.
np.vectorize 的新 signature 参数#
此参数允许您以 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
在Python 3中,新的整数除法语义也适用于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 上也包含 bytes#
以前,它在Python2上包含str (bytes) 和 unicode,但在Python3上只包含str (unicode).
改进#
bitwise_and 恒等更改#
先前的标识是1,结果是在使用reduce方法时,除了LSB之外的所有位都被屏蔽了. 新的标识是-1,它应该在补码机器上正常工作,因为所有位都将设置为1.
Generalized Ufuncs 现在将解锁 GIL#
Generalized Ufuncs,包括 linalg 模块的大部分,现在将解锁 Python 全局解释器锁.
np.fft 中的缓存现在在总大小和项目计数方面受到限制#
np.fft 中加速相同长度的连续FFT的缓存不再无限制地增长. 它们已被LRU(最近最少使用)缓存所取代,如果达到内存大小或项目计数限制,LRU缓存会自动逐出不再需要的项目.
改进了对零宽度字符串/unicode dtypes的处理#
修复了显式禁止零宽度字符串dtypes(即 dtype('S0') 或 dtype('U0') )数组的几个接口, 并修复了几个未正确处理此类dtypes的错误. 特别是,更改了 ndarray.__new__ 以在创建新数组时不要隐式地将 dtype('S0') 转换为 dtype('S1') (unicode也一样).
使用 AVX2 向量化的整数 ufuncs#
如果 cpu 在运行时支持它,则基本的整数 ufuncs 现在使用 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.sort 和 np.argsort 的quicksort种类现在是一个introsort,它是常规的quicksort,但是在没有取得足够的进展时会更改为堆排序. 这样可以保留良好的quicksort性能,同时将最坏情况下的运行时从 O(N^2) 更改为 O(Nlog(N)) .
ediff1d 改进了性能和子类处理#
ediff1d 函数使用数组而不是扁平迭代器进行减法运算.当 to_begin 或 to_end 不是 None 时,减法运算将就地执行,以消除复制操作.一个副作用是某些子类可以更好地处理,即 astropy.Quantity,因为创建了完整的数组,进行了包装,然后设置了开始和结束值,而不是使用 concatenate.
改进了 float16 数组的 ndarray.mean 的精度#
float16 数组的平均值计算现在以 float32 执行,以提高精度.这在 Theano 等包中应该很有用,在这些包中,float16 的精度足够,并且其较小的 footprint 是可取的.
变更#
现在所有类数组方法都在 fromnumeric.py 中使用关键字参数调用#
在内部,fromnumeric.py 中的许多类数组方法都使用位置参数而不是关键字参数调用,因为它们的外部签名是这样的.这导致下游 ‘pandas’ 库中出现了一个关于 ‘numpy’ 兼容性的问题.现在,这个模块中的所有类数组方法都使用关键字参数调用.
在大多数情况下,对 np.memmap 对象的操作会返回 numpy 数组#
以前,即使结果实际上没有进行内存映射,对 memmap 对象的操作也会误导性地返回 memmap 实例.例如, arr + 1 或 arr + arr 将返回 memmap 实例,尽管输出数组中没有内存进行内存映射.1.12 版本从这些操作返回普通的 numpy 数组.
此外,memmap 的缩减(例如 .sum(axis=None ) 现在返回一个 numpy 标量,而不是一个 0d memmap.
增加了警告的 stacklevel#
基于 python 的警告的 stacklevel 增加了,因此大多数警告将报告用户代码的错误行,而不是给出警告本身的行.现在对 stacklevel 的传递进行了测试,以确保新警告将收到 stacklevel 参数.
这会导致具有“default”或“module”过滤器的警告为每个错误的用户代码行或用户模块显示一次,而不是仅显示一次.在 3.4 之前的 python 版本上,这可能会导致出现之前被错误忽略的警告,这可能会令人惊讶,尤其是在测试套件中.