NumPy 1.9.0 发行说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.4.
亮点#
在各个领域进行了大量性能改进,最值得注意的是,索引和小数组上的操作速度明显加快.索引操作现在也释放 GIL.
添加了 nanmedian 和 nanpercentile 使 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 中返回可写视图
S 和/或 a dtypes 可能会更改以表示 Python 字符串而不是字节,在 Python 3 中这两种类型非常不同.
兼容性说明#
diagonal 和 diag 函数返回只读视图.#
在 NumPy 1.8 中,diagonal 和 diag 函数返回只读副本,在 NumPy 1.9 中它们返回只读视图,在 1.10 中它们将返回可写视图.
特殊标量浮点值不再导致向上转换为 double#
在以前的 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 < 1.9 相比,使用 numpy.random.binomial 可能会改变 RNG 状态#
已修复生成二项式随机变量的算法中的一个错误. 此更改可能会更改执行的随机抽取次数,因此在调用distribution.c::rk_binomial_btpe之后,序列位置将有所不同. 依赖于 RNG 处于已知状态的任何测试都应进行检查和/或更新.
强制随机种子为 32 位无符号整数#
如果种子无法安全地转换为 32 位无符号整数,则 np.random.seed 和 np.random.RandomState 现在会引发 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 索引在此版本中得到了完全重写. 这使得大多数高级整数索引操作更快,并且应该没有其他影响. 但是,在高级索引操作中引入了一些细微的更改和弃用:
对标量数组的布尔索引将始终返回一个新的 1-d 数组. 这意味着
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]在a为零维时工作.在 NumPy 1.8 中,如果运算结果是标量,则可以使用等价于 1 和 0 的
array(True)和array(False).这将在 NumPy 1.9 中引发错误,并且如上所述,将来会被视为布尔索引.所有非整数类数组都已被弃用,自定义整数类对象的对象数组可能必须显式转换.
高级索引的错误报告信息更丰富,但某些情况下错误类型已更改.(索引数组的广播错误报告为
IndexError)不建议使用多于一个省略号 (
...) 进行索引.
不建议使用非整数的缩减轴索引.#
不建议使用非整数轴索引来缩减 ufuncs,如 add.reduce 或 sum .
promote_types 和字符串 dtype#
当给定一个整数或浮点 dtype 作为参数,另一个字符串 dtype 作为参数时, promote_types 函数现在返回有效的字符串长度.之前,它总是返回输入的字符串 dtype,即使它不够长以存储转换为字符串的最大整数/浮点值.
can_cast 和字符串 dtype#
如果字符串 dtype 的长度不足以存储转换为字符串的最大整数/浮点值,则 can_cast 函数现在在“safe”强制转换模式下对整数/浮点 dtype 和字符串 dtype 返回 False. 以前, can_cast 在“safe”模式下对任何长度的整数/浮点 dtype 和字符串 dtype 返回 True.
astype 和字符串 dtype#
如果在“safe”强制转换模式下,要强制转换到的字符串 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’ 填充的数组.
新特性#
百分位数支持更多插值选项#
np.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 模块中的类型层次结构中注册.
increasing 参数已添加到 np.vander#
Vandermonde 矩阵的列的顺序可以用这个新的布尔参数指定.
unique_counts 参数已添加到 np.unique#
现在可以将每个唯一项在输入中出现的次数作为可选返回值获取.
nan 函数中对中位数和百分位数(percentile)的支持#
np.nanmedian 和 np.nanpercentile 函数的行为类似于中位数和百分位数函数,只不过它们会忽略 NaNs.
添加了 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 的准确性.
百分位数(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#
弃用#
用于序列重复的非整数标量#
使用非整数 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
即使 a 和 b 中的数组是同一个对象,也会始终返回 False(并且在将来会报错).
如果广播或元素比较等失败,等式运算符 == 将在将来引发类似于 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 版本.