NumPy 1.13.0 发行说明#

此版本支持 Python 2.7 和 3.4 - 3.6.

亮点#

  • a + b + c 这样的操作将在某些平台上重用临时变量,从而减少内存使用并加快执行速度.

  • Inplace 操作会检查输入是否与输出重叠,并创建临时变量以避免问题.

  • 新的 __array_ufunc__ 属性为类提供了改进的功能来覆盖默认的 ufunc 行为.

  • 用于创建分块数组的新 np.block 函数.

新函数#

  • 新的 np.positive ufunc.

  • 新的 np.divmod ufunc 提供了更高效的 divmod.

  • 新的 np.isnat ufunc 测试 NaT 特殊值.

  • 新的 np.heaviside ufunc 计算 Heaviside 函数.

  • 新的 np.isin 函数,改进了 in1d .

  • 用于创建分块数组的新 np.block 函数.

  • 新的 PyArray_MapIterArrayCopyIfOverlap 添加到 NumPy C-API.

有关详细信息,请参见下文.

弃用#

  • f(x, y=out) 调用 np.fix , np.isposinfnp.isneginf 已被弃用 - 该参数应作为 f(x, out=out) 传递,这与其他类似 ufunc 的接口相匹配.

  • 自 1.7 版本以来已弃用的 C-API NPY_CHAR 类型编号现在将在运行时引发弃用警告.需要重新编译使用旧 f2py 版本构建的扩展以删除警告.

  • 当应用于超过 2 维的数组时,应使用显式的 axis 参数调用 np.ma.argsort , np.ma.minimum.reducenp.ma.maximum.reduce ,因为此参数的默认值 ( None ) 与 numpy 的其余部分(分别为 -1 , 00 )不一致.

  • np.ma.MaskedArray.mini 已弃用,因为它几乎复制了 np.MaskedArray.min 的功能.可以使用 np.ma.minimum.reduce 获得完全等效的行为.

  • np.ma.minimumnp.ma.maximum 的单参数形式已被弃用. np.maximum . np.ma.minimum(x) 现在应该拼写为 np.ma.minimum.reduce(x) ,这与使用 np.minimum 完成此操作的方式一致.

  • 在非数字 dtypes 上调用 ndarray.conjugate 已被弃用(它应该与 np.conjugate 的行为相匹配,后者会引发错误).

  • axis 关键字不满足 -a.ndim - 1 <= axis <= a.ndim 时调用 expand_dims ,其中 a 是正在重塑的数组已被弃用.

未来变化#

  • 具有不同字段名称的结构化数组之间的赋值将在 NumPy 1.14 中更改.以前,dst 中的字段将被设置为 src 中同名字段的值.在 numpy 1.14 中,字段将改为"按位置"分配:dst 的第 n 个字段将被设置为 src 数组的第 n 个字段.请注意,NumPy 1.12 中引发的 FutureWarning 错误地将此更改报告为计划用于 NumPy 1.13 而不是 NumPy 1.14.

构建系统更改#

  • numpy.distutils 现在可以使用兼容 GCC 的编译器自动确定 C 文件依赖项.

兼容性说明#

错误类型变更#

  • 当输入为空时, numpy.hstack() 现在抛出 ValueError 而不是 IndexError .

  • 接受 axis 参数的函数,当该参数超出范围时,现在抛出 np.AxisError ,而不是 IndexErrorValueError 的混合.为了向后兼容, AxisError 是这两种错误的子类.

元组对象 dtypes#

已移除对某些不常用的 dtype 的支持,这些 dtype 是无意中允许的,形式为 (old_dtype, new_dtype) ,其中任何一个 dtype 是或包含 object dtype. 作为例外, (object, [('name', object)]) 形式的 dtype 仍然受支持,因为有证据表明已存在使用.

DeprecationWarning 变为 error#

有关更多详细信息,请参见"更改"部分.

  • partition ,当使用非整数分区索引时抛出 TypeError.

  • oa_ndim == 0op_axes 为 NULL 时, NpyIter_AdvancedNew 抛出 ValueError.

  • negative(bool_) ,当对布尔值应用 negative 时抛出 TypeError.

  • subtract(bool_, bool_) ,当从布尔值中减去布尔值时抛出 TypeError.

  • np.equal, np.not_equal ,对象标识不会覆盖失败的比较.

  • np.equal, np.not_equal ,对象标识不会覆盖非布尔比较.

  • 已删除不推荐使用的布尔索引行为. 有关详细信息,请参见下面的"更改".

  • 已删除不推荐使用的 np.alterdot()np.restoredot() .

针对已更改行为的 FutureWarning#

有关更多详细信息,请参见"更改"部分.

  • numpy.average 保留子类

  • array == Nonearray != None 执行元素级比较.

  • np.equal, np.not_equal ,对象标识不会覆盖比较结果.

dtypes 现在始终为 True#

以前, bool(dtype) 会退回到默认的 python 实现,该实现会检查 len(dtype) > 0 是否成立. 由于 dtype 对象将 __len__ 实现为记录字段的数量,因此标量 dtype 的 bool 将评估为 False ,这很不直观. 现在,对于所有 dtype, bool(dtype) == True .

ndarray 子类中不再需要 __getslice____setslice__#

在 Python 2.7 中对 np.ndarray 进行子类化时,不再_需要_在派生类上实现 __*slice__ ,因为 __*item__ 将正确地拦截这些调用.

实现了这些功能的任何代码都将与以前完全一样工作. 调用 ndarray.__getslice__ (例如,通过 super(...).__getslice__ )的代码现在将发出 DeprecationWarning - 应使用 .__getitem__(slice(start, end)) .

现在使用 ... (省略号)索引MaskedArrays/Constants返回MaskedArray#

此行为与 np.ndarray 的行为相呼应,并考虑了对象 dtype 的 MaskedArrays 中的嵌套数组,以及省略号与其他形式的索引的组合.

C API 变更#

空数组上的 GUfunc 和 NpyIter 轴移除#

现在允许从 NpyIter 中删除零大小的轴. 这可能意味着从 NpyIter 中删除轴的代码必须在稍后访问已删除的维度时添加额外的检查.

最大的后续更改是现在允许 gufunc 具有零大小的内部维度. 这意味着 gufunc 现在必须预计到空的内部维度,而这以前是不可能的,并且会引发错误.

对于大多数 gufunc,应该不需要进行任何更改. 但是,现在对于具有诸如 (..., N, M) -> (..., M) 这样的签名的 gufunc 来说,如果 N=0 可以在没有进一步包装代码的情况下返回有效的结果.

PyArray_MapIterArrayCopyIfOverlap 已添加到 NumPy C-API#

类似于 PyArray_MapIterArray ,但带有额外的 copy_if_overlap 参数. 如果 copy_if_overlap != 0 ,则检查输入是否与其他任何数组具有内存重叠,并根据需要进行复制,以避免如果在迭代期间修改输入时出现问题. 有关更完整的文档,请参见文档.

新特性#

已添加 __array_ufunc__#

这是重命名和重新设计的 __numpy_ufunc__ . 任何类(ndarray 子类与否)都可以定义此方法或将其设置为 None ,以便覆盖 NumPy 的 ufunc 的行为. 这与 Python 的 __mul__ 和其他二进制运算例程非常相似. 有关此新选项的实现和行为的更详细描述,请参见文档. 该 API 是暂定的,我们不保证向后兼容性,因为可能会根据反馈进行修改. 有关更多详细信息,请参见 NEP 13documentation.

新的 positive ufunc#

这个 ufunc 对应于一元 + ,但与 ndarray 上的 + 不同,如果数组值不支持数值运算,它将引发错误.

新的 divmod ufunc#

这个 ufunc 对应于 Python 内置函数 divmod ,用于在 numpy 数组上调用时实现 divmod . np.divmod(x, y) 的计算结果等价于 (np.floor_divide(x, y), np.remainder(x, y)) ,但速度大约是分别调用这两个函数的两倍.

np.isnat ufunc 用于测试 NaT 特殊日期时间和时间增量值#

新的 ufunc np.isnat 查找日期时间和时间增量数组中特殊 NaT 值的位置.这类似于 np.isnan .

np.heaviside ufunc 计算 Heaviside 函数#

新函数 np.heaviside(x, h0) (一个 ufunc) 计算 Heaviside 函数:

                   { 0   if x < 0,
heaviside(x, h0) = { h0  if x == 0,
                   { 1   if x > 0.

用于创建分块数组的 np.block 函数#

向当前堆叠函数 vstack , hstackstack 添加一个新的 block 函数.这允许同时跨多个轴进行连接,其语法类似于数组创建,但元素本身可以是数组.例如:

>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
...     [A,               np.zeros((2, 3))],
...     [np.ones((3, 2)), B               ]
... ])
array([[ 2.,  0.,  0.,  0.,  0.],
       [ 0.,  2.,  0.,  0.,  0.],
       [ 1.,  1.,  3.,  0.,  0.],
       [ 1.,  1.,  0.,  3.,  0.],
       [ 1.,  1.,  0.,  0.,  3.]])

虽然主要用于分块矩阵,但它适用于任意维度的数组.

它类似于 Matlab 用于创建分块矩阵的方括号表示法.

isin 函数,改进了 in1d#

新函数 isin 测试 N 维数组的每个元素是否存在于第二个数组中的任何位置.它是 in1d 的增强版,保留了第一个数组的形状.

临时变量删除#

在提供 backtrace 函数的平台上,NumPy 将尝试避免在涉及基本数值类型的表达式中创建临时变量.例如, d = a + b + c 被转换为 d = a + b; d += c ,这可以提高大型数组的性能,因为执行操作所需的内存带宽更少.

uniqueaxes 参数#

在 N 维数组中,用户现在可以选择使用 numpy.unique 查找重复的 N-1 维元素的轴.如果 axis=None (默认),则恢复原始行为.

np.gradient 现在支持非均匀间隔的数据#

用户现在可以为数据指定一个非恒定的间距.特别是, np.gradient 现在可以接受:

  1. 单个标量,用于指定所有维度的采样距离.

  2. N 个标量,用于指定每个维度的恒定采样距离.即 dx , dy , dz ,…

  3. N 个数组,用于指定沿 F 每个维度值的坐标.数组的长度必须与相应维度的大小匹配

  4. N 个标量/数组的任意组合,其含义与 2. 和 3. 相同.

这意味着,例如,现在可以执行以下操作:

>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1. ,  1. , -0.5], [ 1. ,  1. , -0.5]]),
 array([[ 2. ,  2. ,  2. ], [ 2. ,  1.7,  0.5]])]

支持在 apply_along_axis 中返回任意维度的数组#

以前,只有标量或一维数组可以由传递给 apply_along_axis 的函数返回.现在,它可以返回任何维度的数组(包括 0D),并且此数组的形状会替换被迭代数组的轴.

.ndim 属性已添加到 dtype 以补充 .shape#

为了与 ndarraybroadcast 保持一致, d.ndimlen(d.shape) 的简写.

支持 Python 3.6 中的 tracemalloc#

NumPy 现在支持使用 Python 3.6 或更高版本的 tracemalloc 模块进行内存跟踪.来自 NumPy 的内存分配被放置到由 numpy.lib.tracemalloc_domain 定义的域中. 请注意,NumPy 分配不会显示在早期 Python 版本的 tracemalloc 中.

可以使用宽松的步幅检查调试来构建 NumPy#

启用宽松步幅检查时,在环境中设置 NPY_RELAXED_STRIDES_DEBUG=1 将导致 NumPy 在编译时将受影响的步幅设置为 npy_intp 的最大值,以便帮助检测下游项目中步幅的无效使用.启用后,无效使用通常会导致引发错误,但错误的具体类型取决于代码的详细信息.在实际应用中观察到了 TypeError 和 OverflowError.

以前的情况是,此选项对于发布版本是禁用的,而在主版本中是启用的,并且两者之间的更改需要编辑代码.现在默认情况下禁用它,但可以为测试版本启用它.

改进#

重叠输入的 Ufunc 行为#

由于数据依赖性问题,在之前的 NumPy 版本中,ufunc 输入和输出操作数具有内存重叠的操作会产生未定义的结果.在 NumPy 1.13.0 中,此类操作的结果现在被定义为与没有内存重叠的等效操作相同.

受影响的操作现在会根据需要创建临时副本,以消除数据依赖性.由于检测这些情况的计算成本很高,因此使用了一种启发式方法,这种方法在极少数情况下可能导致不必要的临时副本.对于数据依赖性足够简单,可以供启发式方法分析的操作,即使数组重叠,也不会创建临时副本,如果可以推断出不需要副本.例如, np.add(a, b, out=a) 将不涉及副本.

为了说明一个以前未定义的操作:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:])

在 NumPy 1.13.0 中,最后一行保证等效于:

>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:])

一个具有简单,非问题数据依赖性的类似操作是:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1])

它将继续产生与以前 NumPy 版本相同的结果,并且不会涉及不必要的临时副本.

此更改也适用于就地二元运算,例如:

>>> x = np.random.rand(500, 500)
>>> x += x.T

此语句现在保证等效于 x[...] = x + x.T ,而在之前的 NumPy 版本中,结果是未定义的.

使用 MinGW 对 64 位 f2py 扩展的部分支持#

包含 Fortran 库的扩展现在可以使用免费的 MinGW 工具集构建,也可以在 Python 3.5 下构建.这对于仅执行计算并适度使用运行时的扩展(例如,从文件读取和写入)效果最佳.请注意,这并不能消除对 Mingwpy 的需求;如果您大量使用运行时,则很可能会遇到问题_.相反,它应该被视为一个权宜之计,直到 Mingwpy 完全正常运行.

扩展也可以使用 MingW 工具集和来自(可移动)WinPython 3.4 发行版的运行时库进行编译,这对于具有 PySide1/Qt4 前端的程序可能很有用.

packbitsunpackbits 的性能改进#

函数 numpy.packbits 与布尔输入和 numpy.unpackbits 已经过优化,对于连续数据而言,速度明显更快.

修复 PPC 长双精度浮点信息#

In previous versions of NumPy, the finfo function returned invalid information about the double double format of the longdouble float type on Power PC (PPC). The invalid values resulted from the failure of the NumPy algorithm to deal with the variable number of digits in the significand that are a feature of PPC long doubles. This release by-passes the failing algorithm by using heuristics to detect the presence of the PPC double double format. A side-effect of using these heuristics is that the finfo function is faster than previous releases.

ndarray 子类更好的默认 repr#

没有 repr 特化的 ndarray 子类现在可以正确缩进其数据和类型行.

更可靠的 masked arrays 比较#

masked arrays 的比较对于 masked 标量存在错误,并且对于维度高于 1 的结构化数组失败.这两个问题现已解决.在此过程中,已确保在获取结构化数组的结果时,已正确忽略被屏蔽的字段,即,如果两个数组中所有未屏蔽的字段都相等,则结果相等,从而使行为与通过比较非结构化 masked array 然后在某个轴上执行 .all() 获得的行为相同.

现在可以使用字符串语法创建带有布尔元素的 np.matrix#

每当尝试将 np.matrix 与布尔值一起使用时,它都会失败,例如, np.matrix('True') .现在,这可以按预期工作.

现在更多的 linalg 操作接受空向量和矩阵#

现在, np.linalg 中的以下所有函数都可以在给定最后两个维度中包含 0 的输入数组时工作: det , slogdet , pinv , eigvals , eigvalsh , eig , eigh .

捆绑的 LAPACK 版本现在是 3.2.2#

NumPy 捆绑了一个 lapack 的最小实现,用于没有安装 lapack 库的系统,名称为 lapack_lite .它已从 LAPACK 3.0.0(1999 年 6 月 30 日)升级到 LAPACK 3.2.2(2010 年 6 月 30 日).有关所有更改的详细信息,请参阅 LAPACK changelogs .

虽然 numpy 没有公开任何新功能,但它修复了一些关于"工作区"大小的错误,并且在某些地方可能使用了更快的算法.

reduce 可以用于更多情况下的 np.hypot.reducenp.logical_xor#

现在可以在空数组上工作,返回 0,并且可以对多个轴进行 reduce 操作.以前,在这些情况下会抛出 ValueError .

更好的对象数组 repr#

包含自身的 object 数组不再导致递归错误.

现在以一种可以清楚区分 2d 对象数组和 1d 对象列表数组的方式打印包含 list 对象的对象数组.

变更#

masked 数组上的 argsort 采用与 sort 相同的默认参数#

默认情况下, argsort 现在将屏蔽值放置在排序数组的末尾,与 sort 已经做的方式相同. 此外, end_with 参数被添加到 argsort ,以与 sort 保持一致. 请注意,此参数未添加到末尾,因此会破坏任何将 fill_value 作为位置参数传递的代码.

average 现在保留子类#

对于 ndarray 子类, numpy.average 现在将返回子类的实例,与大多数其他 NumPy 函数(如 mean )的行为相匹配. 因此,也可能返回标量的调用现在可能会返回一个子类数组标量.

array == Nonearray != None 执行元素级比较#

以前,这些操作分别返回标量 FalseTrue .

对象数组的 np.equal, np.not_equal 忽略对象标识#

以前,这些函数始终将相同的对象视为相等. 这具有覆盖比较失败,比较未返回布尔值的对象(例如 np.arrays)以及比较结果与对象标识不同的对象(例如 NaNs)的效果.

布尔索引的更改#

  • 布尔数组类(例如 python 布尔值列表)始终被视为布尔索引.

  • 布尔标量(包括 python True )是合法的布尔索引,永远不会被视为整数.

  • 布尔索引必须与它们索引的轴的维度相匹配.

  • 在赋值的左侧使用的布尔索引必须与右侧的维度相匹配.

  • 对标量数组进行布尔索引会返回一个新的 1 维数组. 这意味着 array(1)[array(True)] 给出 array([1]) 而不是原始数组.

具有不良协方差矩阵的 np.random.multivariate_normal 行为#

现在可以通过使用两个新的关键字参数来调整该函数在处理协方差矩阵时的行为:

  • tol 可用于指定在检查协方差矩阵是否为正半定矩阵时使用的容差.

  • check_valid 可用于配置该函数在存在非正半定矩阵时将执行的操作. 有效选项为 ignore , warnraise . 默认值 warn 保持了先前版本中使用的行为.

assert_array_less 现在比较 np.inf-np.inf#

以前, np.testing.assert_array_less 忽略所有无穷大值. 根据文档和直觉,这都不是预期的行为. 现在,对于任何实数 x,-inf < x < inf 被认为是 True ,所有其他情况都失败.

assert_array_ 和 masked 数组 assert_equal 隐藏较少的警告#

以前被 assert_array_ 函数隐藏的一些警告不再隐藏. 在大多数情况下,警告应该是正确的,并且如果发生这些警告,将需要更改使用这些函数的测试. 对于 masked 数组 assert_equal 版本,在比较 NaT 时可能会出现警告. 该函数目前不专门处理 NaT 或 NaN,并且如果由于此更改而显示警告,最好此时避免使用它.

memmap 对象中的 offset 属性值#

memmap 对象中的 offset 属性现在设置为文件中 的偏移量. 这仅对于大于 mmap.ALLOCATIONGRANULARITY 的偏移量才是行为变更.

np.realnp.imag 为标量输入返回标量#

以前,当提供标量输入时, np.realnp.imag 过去常常返回数组对象,这与 np.anglenp.conj 等其他函数不一致.

多项式便捷类不能传递给ufuncs#

ABCPolyBase类(便捷类由此派生)设置了 __array_ufun__ = None ,目的是选择不使用ufuncs.如果将多项式便捷类的实例作为参数传递给ufunc,现在会引发 TypeError .

ufunc 的输出参数也可以是元组,同样适用于 ufunc 方法#

对于 ufunc 的调用,已经可以(并且建议)使用带有元组的 out 参数,用于具有多个输出的 ufunc.现在这已经扩展到 reduce , accumulatereduceat 方法中的输出参数.这主要是为了与 __array_ufunc 兼容;目前还没有具有多个输出的 ufunc.