NumPy 1.9.0 发行说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.4。
亮点#
在多个区域进行了大量的性能改进,尤其是索引和小数组上的操作速度显著提高。索引操作现在也释放了 GIL。
添加了 nanmedian 和 nanpercentile,完善了 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 版本中,涉及包含特殊值 NaN、Inf 和 -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.seed 和 np.random.RandomState 现在如果种子无法安全地转换为 32 位无符号整数,则会抛出 ValueError。现在失败的应用程序可以通过将高 32 位值掩码为零来修复:seed = seed & 0xFFFFFFFF。这与旧版本中静默执行的操作相同,因此随机流保持不变。
Argmin 和 argmax 的 out 参数#
np.argmin 和 np.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.reduce 或 sum 等约简 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_item 和 sq_ass_item 序列方法中的负索引#
当直接访问用于项获取的 sq_item 或 sq_ass_item PyObject 插槽时,将不再支持负索引。PySequence_GetItem 和 PySequence_SetItem 然而会修复负索引,以便在那里可以使用它们。
NDIter#
当调用 NpyIter_RemoveAxis 时,迭代器范围将被重置。
当跟踪多索引且迭代器未缓冲时,可以使用 NpyIter_RemoveAxis。在这种情况下,迭代器的大小可能会减小。由于迭代器的总大小有限,因此在调用这些调用之前,迭代器可能过大。在这种情况下,其大小将被设置为 -1,并在移除多索引、设置迭代器范围或获取下一个函数时发出错误,而不是在构造时。
这对当前工作的代码没有影响,但强调了在可能出现这些情况时检查错误返回的必要性。在大多数情况下,迭代的数组与迭代器一样大,因此不会出现这种问题。
此更改已应用于 1.8.1 版本。
字符串 dtype 的 zeros_like 现在返回空字符串#
为了匹配 zeros 函数,zeros_like 现在返回一个用空字符串初始化的数组,而不是一个用 ‘0’ 填充的数组。
新功能#
Percentile 支持更多插值选项#
np.percentile 现在具有插值关键字参数,用于指定当百分位数落在两个值之间时应如何进行插值。有关可用选项,请参阅文档。
Median 和 Percentile 的通用轴支持#
np.median 和 np.percentile 现在支持通用轴参数,如自 1.7 以来的 ufunc 约简。现在可以指定 axis=(index, index) 来选择约简的轴列表。keepdims 关键字参数也被添加,以便方便地广播到原始形状的数组。
向 np.linspace 和 np.logspace 添加了 dtype 参数#
现在可以使用 dtype 参数指定 linspace 和 logspace 函数返回的数据类型。
对 np.triu 和 np.tril 更通用的广播#
对于 ndim 大于 2 的数组,这些函数现在将应用于最后两个轴,而不是引发异常。
tobytes 是 tostring 方法的别名#
ndarray.tobytes 和 MaskedArray.tobytes 已被添加为 tostring 的别名,后者将数组导出为 bytes。这在 Python 3 中更一致,因为 str 和 bytes 不相同。
构建系统#
添加了对 ppc64le 和 OpenRISC 架构的实验性支持。
与 Python numbers 模块的兼容性#
所有 NumPy 数值类型现在都已在 Python numbers 模块的类型层次结构中注册。
向 np.vander 添加了 increasing 参数#
可以通过此新的布尔参数指定范德蒙德矩阵列的排序。
向 np.unique 添加了 unique_counts 参数#
现在可以作为可选的返回值来获取输入中每个唯一项出现的次数。
nanfunctions 中对 median 和 percentile 的支持#
np.nanmedian 和 np.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 对更复杂的基类的支持#
正在移除假设基类表现得像普通数组的内置假设。特别是,repr 和 str 现在应该更可靠地工作。
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(将来会报错),即使 a 和 b 中的数组是同一个对象。
将来,相等运算符 == 将像 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 版本。