NumPy 1.9.0 发行说明#

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

亮点#

  • 在多个区域进行了大量的性能改进,尤其是索引和小数组上的操作速度显著提高。索引操作现在也释放了 GIL。

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

已弃用支持#

  • 旧的 numeric 和 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 类,可用于此类比较。

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

  • S 和/或 a 数据类型可能会更改以表示 Python 字符串而不是字节,在 Python 3 中,这两种类型差异很大。

兼容性说明#

对角线和 diag 函数返回只读视图。#

在 NumPy 1.8 中,对角线和 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 索引已完全重写。这使得大多数高级整数索引操作速度更快,并且没有其他影响。但是,在高级索引操作中引入了一些细微的更改和弃用。

  • 布尔索引到标量数组将始终返回一个新的一维数组。这意味着 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)将是合法的 *布尔* 索引。目前,对于零维数组,这已经适用于标量数组,以允许通用的 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#

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

astype 和字符串 dtype#

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

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’ 填充的数组。

新功能#

Percentile 支持更多插值选项#

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

Median 和 Percentile 的通用轴支持#

np.mediannp.percentile 现在支持通用轴参数,如自 1.7 以来的 ufunc 约简。现在可以指定 axis=(index, index) 来选择约简的轴列表。keepdims 关键字参数也被添加,以便方便地广播到原始形状的数组。

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

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

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

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

tobytestostring 方法的别名#

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

构建系统#

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

与 Python numbers 模块的兼容性#

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

np.vander 添加了 increasing 参数#

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

np.unique 添加了 unique_counts 参数#

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

nanfunctions 中对 median 和 percentile 的支持#

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 的数值稳定性更好#

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

Percentile 基于 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 释放#

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

MaskedArray 对更复杂的基类的支持#

正在移除假设基类表现得像普通数组的内置假设。特别是,reprstr 现在应该更可靠地工作。

C-API#

弃用#

Python 3 对其文件对象应用了内部缓冲,这导致了用于序列重复的非整数标量#

使用非整数 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

所有这些更改目前都将给出 Deprecation- 或 FutureWarnings。

C-API#

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

此更改已应用于 1.8.1 版本。