NumPy 1.9.0 发行说明#

此版本支持 Python 2.6 - 2.7 和 3.2 - 3.4。

亮点#

  • 在多个领域有大量性能改进,最显著的是对小型数组的索引和操作显著加快。索引操作现在也释放了 GIL。

  • 添加了 nanmediannanpercentile,完善了 nan 函数集。

已移除的支持#

  • 已移除 oldnumeric 和 numarray 模块。

  • 已移除 doc/pyrex 和 doc/cython 目录。

  • 已移除 doc/numpybook 目录。

  • numpy/testing/numpytest.py 文件及其包含的 importall 函数已被移除。

未来变更#

  • numpy/polynomial/polytemplate.py 文件将在 NumPy 1.10.0 中移除。

  • 就地操作的默认类型转换在 NumPy 1.10.0 中将变为 ‘same_kind’。这肯定会破坏一些当前忽略警告的代码。

  • 放松步幅检查将成为 1.10.0 中的默认设置

  • 字符串版本检查将失效,例如,‘1.9’ > ‘1.10’ 为 True。已添加 NumpyVersion 类,可用于此类比较。

  • diagonal 和 diag 函数将在 1.10.0 中返回可写视图。

  • 在 Python 3 中,S 和/或 a 数据类型可能会更改为表示 Python 字符串而不是字节,这两种类型非常不同。

兼容性说明#

diagonal 和 diag 函数返回只读视图。#

在 NumPy 1.8 中,diagonal 和 diag 函数返回只读副本;在 NumPy 1.9 中,它们返回只读视图;在 1.10 中,它们将返回可写视图。

特殊的标量浮点值不再导致向上转换为双精度浮点数#

在之前的 NumPy 版本中,涉及包含特殊值 NaNInf-Inf 的浮点标量运算会导致结果类型至少为 float64。由于特殊值可以在最小的可用浮点类型中表示,因此不再执行向上转换。

例如,以下代码的 dtype:

np.array([1.], dtype=np.float32) * float('nan')

现在仍为 float32 而不是被转换为 float64。涉及非特殊值的操作没有改变。

百分位数输出变化#

如果给定多个要计算的百分位数,numpy.percentile 将返回一个数组而不是列表。单个百分位数仍返回一个标量。该数组等同于通过 np.array 将旧版本中返回的列表转换为数组。

如果使用 overwrite_input 选项,则输入只会被部分排序而不是完全排序。

ndarray.tofile 异常类型#

所有 tofile 异常现在都是 IOError,之前有些是 ValueError

无效填充值异常#

numpy.ma.core._check_fill_value 的两项更改

  • 当填充值为字符串且数组类型不是 ‘OSUV’ 之一时,将引发 TypeError,而不是使用默认填充值。

  • 当填充值溢出数组类型时,将引发 TypeError,而不是 OverflowError。

多项式类不再继承自 PolyBase#

这可能会给那些依赖于多项式类继承自 PolyBase 的用户带来问题。它们现在都继承自抽象基类 ABCPolyBase。严格来说,这应该涉及弃用,但没有找到使用旧基类的外部代码。

使用 numpy.random.binomial 可能会改变 RNG 状态(与 numpy < 1.9 相比)#

已修复生成二项式随机变量算法中的一个错误。此更改可能会改变执行的随机抽样次数,因此在调用 distribution.c::rk_binomial_btpe 后,序列位置将不同。因此,依赖于 RNG 处于已知状态的任何测试都应进行检查和/或更新。

随机种子强制为 32 位无符号整数#

np.random.seednp.random.RandomState 现在会在种子无法安全转换为 32 位无符号整数时抛出 ValueError。现在失败的应用程序可以通过将高 32 位值屏蔽为零来修复:seed = seed & 0xFFFFFFFF。这是旧版本中静默执行的操作,因此随机流保持不变。

Argmin 和 argmax 的 out 参数#

np.argminnp.argmax 及其等效 C-API 函数的 out 参数现在会检查是否与所需的输出形状完全匹配。如果检查失败,将引发 ValueError 而不是 TypeError

Einsum#

移除不必要的广播符号限制。np.einsum('ijk,j->ijk', A, B) 也可以写成 np.einsum('ij...,j->ij...', A, B)(‘j’ 上不再需要省略号)

索引#

NumPy 索引在此版本中进行了彻底重写。这使得大多数高级整数索引操作大大加快,并且应该没有其他影响。然而,高级索引操作中引入了一些细微的更改和弃用。

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

  • 对一维数组进行高级索引过去(未记录)有特殊的处理,当值数组的形状太小或不匹配时,会在赋值中重复值数组。使用此方法的代码将引发错误。为了兼容性,您可以使用 arr.flat[index] = values,它使用旧的代码分支。(例如 a = np.ones(10); a[np.arange(10)] = [1, 2, 3]

  • 高级索引的迭代顺序过去始终是 C 顺序。在 NumPy 1.9 中,迭代顺序会适应输入,并且不保证(除了为了兼容性,单个高级索引永远不会反转)。这意味着如果将多个值分配给同一个元素,则结果是未定义的。例如 arr[[0, 0], [1, 1]] = [1, 2],这可能会将 arr[0, 1] 设置为 1 或 2。

  • 与迭代顺序相同,高级索引结果的内存布局已进行调整以实现更快的索引,并且无法预测。

  • 所有索引操作都返回一个视图或一个副本。没有索引操作会返回原始数组对象。(例如 arr[...]

  • 将来,布尔类数组(例如 Python 布尔值列表)将始终被视为布尔索引,布尔标量(包括 Python True)将是一个合法的 布尔 索引。目前,对于标量数组来说,这已经适用,以便在 a 是零维时,通用的 positive = a[a > 0] 可以工作。

  • 在 NumPy 1.8 中,如果操作结果是标量,可以使用 array(True)array(False) 等同于 1 和 0。这将在 NumPy 1.9 中引发错误,并且如上所述,未来将视为布尔索引。

  • 所有非整数类数组都已弃用,自定义整数类对象的对象数组可能需要显式转换。

  • 高级索引的错误报告更具信息性,但在某些情况下错误类型已更改。(索引数组的广播错误报告为 IndexError

  • 使用多个省略号 (...) 进行索引已弃用。

非整数规约轴索引已弃用#

对诸如 add.reducesum 等规约 ufunc 的非整数轴索引已弃用。

promote_types 和字符串 dtype#

promote_types 函数现在在给定整数或浮点 dtype 作为其中一个参数、字符串 dtype 作为另一个参数时,返回有效的字符串长度。以前,它总是返回输入的字符串 dtype,即使它不足以存储转换为字符串的最大整数/浮点值。

can_cast 和字符串 dtype#

can_cast 函数现在在“安全”类型转换模式下,如果字符串 dtype 长度不足以存储转换为字符串的最大整数/浮点值,则对于整数/浮点 dtype 和字符串 dtype 返回 False。以前,can_cast 在“安全”模式下,对于整数/浮点 dtype 和任意长度的字符串 dtype 都返回 True。

astype 和字符串 dtype#

astype 方法现在会在“安全”类型转换模式下,如果目标字符串 dtype 不足以容纳被转换的整数/浮点数组的最大值时,返回一个错误。以前即使结果被截断也允许进行类型转换。

npyio.recfromcsv 关键字参数更改#

npyio.recfromcsv 不再接受未文档化的 update 关键字,该关键字过去用于覆盖 dtype 关键字。

doc/swig 目录已移动#

doc/swig 目录已移动到 tools/swig

npy_3kcompat.h 头文件已更改#

未使用的 simple_capsule_dtor 函数已从 npy_3kcompat.h 中移除。请注意,此头文件不应在 NumPy 之外使用;其他项目在需要时应使用此文件自己的副本。

C-Api sq_itemsq_ass_item 序列方法中的负索引#

当直接访问 sq_itemsq_ass_item PyObject 槽以获取项目时,负索引将不再受支持。但是,PySequence_GetItemPySequence_SetItem 会修复负索引,以便可以在其中使用它们。

NDIter#

当调用 NpyIter_RemoveAxis 时,迭代器范围将被重置。

当跟踪多索引且迭代器未被缓冲时,可以使用 NpyIter_RemoveAxis。在这种情况下,迭代器的大小可以缩小。因为迭代器的总大小是有限的,所以在这些调用之前迭代器可能太大。在这种情况下,它的大小将被设置为 -1,并且错误不是在构造时发出,而是在移除多索引、设置迭代器范围或获取下一个函数时发出。

这对于当前正常工作的代码没有影响,但强调了如果这些条件可能发生,则需要检查错误返回。在大多数情况下,被迭代的数组与迭代器一样大,因此不会发生此类问题。

此更改已应用于 1.8.1 版本。

字符串 dtype 的 zeros_like 现在返回空字符串#

为了与 zeros 函数匹配,zeros_like 现在返回用空字符串初始化的数组,而不是填充 ‘0’ 的数组。

新特性#

百分位数支持更多插值选项#

np.percentile 现在具有 interpolation 关键字参数,用于指定如果百分位数介于两个值之间,应如何插值。有关可用选项,请参阅文档。

中位数和百分位数支持泛化轴#

np.mediannp.percentile 现在支持泛化轴参数,就像 1.7 版本以来的 ufunc 规约一样。现在可以说 axis=(index, index) 来选择用于规约的轴列表。还添加了 keepdims 关键字参数,以方便广播到原始形状的数组。

np.linspacenp.logspace 添加了 Dtype 参数#

linspacelogspace 函数返回的数据类型现在可以使用 dtype 参数指定。

更通用的 np.triunp.tril 广播#

对于 ndim 超过 2 的数组,这些函数现在将应用于最后两个轴,而不是引发异常。

tostring 方法的 tobytes 别名#

已添加 ndarray.tobytesMaskedArray.tobytes 作为 tostring 的别名,用于将数组导出为 bytes。这在 Python 3 中更加一致,因为 strbytes 是不同的。

构建系统#

增加了对 ppc64le 和 OpenRISC 架构的实验性支持。

与 Python numbers 模块的兼容性#

所有 NumPy 数值类型现在都已在 Python numbers 模块的类型层次结构中注册。

np.vander 添加了 increasing 参数#

范德蒙矩阵列的顺序可以通过这个新的布尔参数指定。

np.unique 添加了 unique_counts 参数#

现在可以作为可选返回值获取每个唯一项在输入中出现的次数。

nan 函数中对中位数和百分位数的支持#

np.nanmediannp.nanpercentile 函数的行为类似于 median 和 percentile 函数,但会忽略 NaN 值。

添加了 NumpyVersion 类#

该类可以从 numpy.lib 导入,并可在 NumPy 版本变为 1.10.devel 时用于版本比较。例如

>>> from numpy.lib import NumpyVersion
>>> if NumpyVersion(np.__version__) < '1.10.0'):
...     print('Wow, that is an old NumPy version!')

允许保存具有大量命名列的数组#

NumPy 存储格式 1.0 只允许数组头部的总大小为 65535 字节。具有大量列的结构化数组可能会超出此限制。已添加新的 2.0 格式,将头部大小扩展到 4 GiB。 np.save 将自动以 2.0 格式保存,如果数据需要,否则将始终使用兼容性更好的 1.0 格式。

np.cross 的完整广播支持#

np.cross 现在能够正确广播其两个输入数组,即使它们的维度数量不同。在早期版本中,这会导致引发错误或计算出错误结果。

改进#

某些情况下求和的数值稳定性更好#

现在,sum 方法中使用成对求和,但仅限于沿快速轴以及长度小于等于 8192 的值组。这在某些常见情况下也应提高 var 和 std 的准确性。

百分位数通过 np.partition 实现#

np.percentile 已通过 np.partition 实现,后者仅通过选择算法部分排序数据。这使时间复杂度从 O(nlog(n)) 提高到 O(n)

np.array 的性能改进#

使用 np.array 将包含数组的列表转换为数组的性能已得到改进。现在其速度相当于 np.vstack(list)

np.searchsorted 的性能改进#

对于内置数值类型,np.searchsorted 不再依赖于数据类型的 compare 函数来执行搜索,现在由类型特定的函数实现。根据输入的大小,这可以带来超过 2 倍的性能提升。

np.distutils 可选的降低详细程度#

numpy.distutils.system_info.system_info.verbosity = 0,然后调用 numpy.distutils.system_info.get_info('blas_opt') 将不会在输出中打印任何内容。这主要适用于使用 numpy.distutils 的其他包。

np.random.multivariate_normal 中的协方差检查#

当协方差矩阵不是正半定矩阵时,会引发 RuntimeWarning 警告。

多项式类不再基于模板#

多项式类已重构为使用抽象基类而不是模板,以实现通用接口。这使得导入多项式包更快,因为这些类在导入时不需要编译。

更多 GIL 释放#

现在有更多函数释放了全局解释器锁 (GIL),允许使用 threading 模块进行更高效的并行化。最值得注意的是,现在为花式索引、np.where 释放了 GIL,并且 random 模块现在使用每状态锁而不是 GIL。

MaskedArray 支持更复杂的基类#

内置的关于基类行为类似于普通数组的假设正在被移除。特别是,reprstr 现在应该更可靠地工作。

C-API#

弃用#

序列重复的非整数标量#

使用非整数 NumPy 标量重复 Python 序列已弃用。例如,np.float_(2) * [1] 将来会引发错误。

select 输入弃用#

select 的整数和空输入已弃用。将来只有布尔数组是有效条件,空的 condlist 将被视为输入错误而不是返回默认值。

rank 函数#

rank 函数已弃用,以避免与 numpy.linalg.matrix_rank 混淆。

对象数组相等性比较#

将来,对象数组的比较(无论是 == 还是 np.equal)将不再使用身份检查。例如

>>> a = np.array([np.array([1, 2, 3]), 1])
>>> b = np.array([np.array([1, 2, 3]), 1])
>>> a == b

将始终返回 False(将来会引发错误),即使 ab 中的数组是同一个对象。

相等运算符 == 将来如果广播或元素比较等失败,将像 np.equal 一样引发错误。

将来,与 arr == None 的比较将进行逐元素比较,而不是直接返回 False。代码应该使用 arr is None

所有这些更改目前都会发出 DeprecationWarning 或 FutureWarning。

C-API#

实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose 由于 Python 3 对其文件对象应用的内部缓冲而损坏。为了解决此问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并且旧函数已弃用。由于这些函数的脆弱性,建议在可能的情况下使用 Python API。

此更改已应用于 1.8.1 版本。