NumPy 1.12.0 发行说明#
此版本支持 Python 2.7 和 3.4 - 3.6.
亮点#
NumPy 1.12.0 版本包含大量修复和改进,但很少有突出于其他所有内容.这使得挑选亮点有些随意,但以下内容可能特别令人感兴趣或表明可能产生未来影响的领域.
现在可以优化
np.einsum中的操作顺序,以实现巨大的速度提升.np.vectorize的新signature参数,用于使用核心维度进行矢量化.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 为基数(正数)或 2 的补码形式(负数)的数字,则该函数会静默地忽略该参数,并返回一个使用该形式所需的最少位数的表示.从用户的角度来看,这种行为现在被认为是不安全的,并且将来会引发错误.
未来变化#
在 1.13 版本中,NAT 将始终比较为 False,但
NAT != NAT除外,它将为 True.简而言之,NAT 的行为将类似于 NaN.在 1.13 版本中,
np.average将保留子类,以匹配大多数其他 numpy 函数(如 np.mean)的行为. 特别是,这意味着返回标量的调用可能返回一个 0 维子类对象.
结构化数组的多字段操作#
在 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']] .
兼容性说明#
DeprecationWarning 变为 error#
使用浮点数索引会引发
IndexError,例如,a[0, 0.0].使用非整数 array_like 索引会引发
IndexError,例如,a['1', '2']使用多个省略号索引会引发
IndexError,例如,a[..., ...].非整数用作索引值会引发
TypeError,例如,在reshape,take和指定 reduce axis 中.
针对已更改行为的 FutureWarning#
如果未给出 dtype,
np.full现在返回一个填充值的 dtype 的数组,而不是默认为 float.如果参数是 ndarray 的子类,
np.average将发出警告,因为子类将从 1.13 版本开始保留.(请参阅 Future Changes)
power 和 ** 对整数的负整数次幂引发错误#
以前的行为取决于是否涉及 numpy 标量整数或 numpy 整数数组.
对于数组
零的负整数次幂返回最小整数值.
1 和 -1 的负整数次幂返回正确的值.
其余整数在提升到负整数次幂时返回零.
对于标量
零的负整数次幂返回最小整数值.
1 和 -1 的负整数次幂返回正确的值.
其余整数有时返回零,有时返回正确的浮点数,具体取决于整数类型组合.
所有这些情况现在都会引发 ValueError ,除了那些公共类型为浮点数的整数组合,例如 uint64 和 int8. 人们认为,采用简单的规则是最好的方法,而不是为整数单位设置特殊的例外. 如果您需要负幂,请使用非精确类型.
宽松的 stride 检查是默认设置#
这将对假定 F_CONTIGUOUS 和 C_CONTIGUOUS 互斥的代码产生一些影响,并且可以设置为确定现在两者都是的数组的默认顺序.
np.percentile ‘midpoint’ 插值方法已针对精确索引修复#
当两者重合时,’midpoint’ 插值器现在给出与 ‘lower’ 和 ‘higher’ 相同的结果. ‘lower’ + 0.5 的先前行为已修复.
keepdims kwarg 传递给用户类方法#
采用 keepdims kwarg 的 numpy 函数现在将值传递给 ndarray 子类上的相应方法. 以前, keepdims 关键字会被静默删除. 这些函数现在具有以下行为:
如果用户未提供
keepdims,则不会将任何关键字传递给底层方法.keepdims的任何用户提供的值都将作为关键字参数传递给该方法.
如果该方法不支持 keepdims kwarg 并且用户显式传入 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 的切片中发出 RuntimeWarning 警告并返回 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 的 Writeable 关键字参数#
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,以便给出 informative 错误.
在 numpy/__init__.py 中添加一个 hook,以导入将保留为空(除了文档字符串)在标准 numpy 源代码中的 numpy/_distributor_init.py 文件,但是可以被制造 numpy 二进制分发的人覆盖.
新增 nan 函数 nancumsum 和 nancumprod#
Nan 函数 nancumsum 和 nancumprod 已被添加以通过忽略 nans 来计算 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 版本中使用"忽略"过滤器忽略警告可能会很快导致这些(或类似的)警告无法被可靠地测试.
该上下文管理器允许像 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 参数将 ‘doane’ 和 ‘sqrt’ 估计器添加到 histogram .增加了对具有自动箱估计的范围限制直方图的支持.
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,导致除了 LSB 之外的所有位在使用 reduce 方法时都被屏蔽掉.新的恒等值为 -1,它应该在二进制补码机器上正常工作,因为所有的位都将被设置为 1.
广义 Ufunc 现在将释放 GIL#
广义 Ufunc,包括 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,因为完整的数组被创建,包装,然后设置起始和结束值,而不是使用连接.
提高了 float16 数组的 ndarray.mean 的精度#
float16 数组的平均值计算现在以 float32 执行,以提高精度.这在 Theano 等包中应该很有用,在这些包中 float16 的精度足够,并且其较小的占用空间是理想的.
变更#
所有类数组方法现在都使用 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 参数.
这会导致具有"default"或"module"过滤器的警告,对于每个引发问题的用户代码行或用户模块显示一次,而不是仅显示一次.在低于 3.4 的 Python 版本上,这可能会导致以前被错误忽略的警告出现,这可能会令人惊讶,尤其是在测试套件中.