NumPy 1.9.0 发行说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.4.
亮点#
在各个领域进行了大量的性能改进,最值得注意的是,索引和小数组上的操作速度明显加快.索引操作现在也释放 GIL.
添加了 nanmedian 和 nanpercentile 来完善 nanfunction 集合.
放弃支持#
已删除 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.random.binomial 可能会改变 RNG 状态,这与 numpy < 1.9 不同#
修复了生成二项随机变量的算法中的一个 bug.此更改可能会更改执行的随机抽取次数,因此在调用 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)不建议使用多个省略号 (
...) 进行索引.
不建议使用非整数缩减轴索引#
不建议使用非整数轴索引来缩减 ufunc,如 add.reduce 或 sum .
promote_types 和字符串 dtype#
当给定一个整数或浮点 dtype 作为一个参数,而一个字符串 dtype 作为另一个参数时, promote_types 函数现在返回一个有效的字符串长度.以前,它总是返回输入的字符串 dtype,即使它不够长,无法存储转换为字符串的最大整数/浮点值.
can_cast 和字符串 dtype#
现在,如果字符串 dtype 的长度不足以存储转换为字符串的最大整数/浮点数值,则 can_cast 函数在"安全"转换模式下,对于整数/浮点 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_item 和 sq_ass_item 序列方法中的负索引#
当直接访问用于项目获取的 sq_item 或 sq_ass_item PyObject 槽时,将不再支持负索引. 但是, PySequence_GetItem 和 PySequence_SetItem 修复了负索引,以便可以在那里使用它们.
NDIter#
现在调用 NpyIter_RemoveAxis 时,迭代器范围将被重置.
当正在跟踪多重索引并且迭代器未被缓冲时,可以使用 NpyIter_RemoveAxis .在这种情况下,迭代器可以缩小大小.因为迭代器的总大小是有限制的,所以在这些调用之前,迭代器可能太大.在这种情况下,它的大小将被设置为 -1 ,并且不是在构建时,而是在移除多重索引,设置迭代器范围或获取下一个函数时发出错误.
这对当前工作的代码没有影响,但强调了如果可能发生这些情况,则必须检查错误返回.在大多数情况下,被迭代的数组与迭代器一样大,因此不会发生此类问题.
此更改已应用于 1.8.1 版本.
字符串 dtypes 的 zeros_like 现在返回空字符串#
为了匹配 zeros 函数, zeros_like 现在返回一个用空字符串初始化的数组,而不是用 ‘0’ 填充的数组.
新特性#
百分位数支持更多插值选项#
np.percentile 现在具有插值关键字参数,用于指定如果百分位数落在两个值之间,应该以哪种方式插值点. 请参阅文档以获取可用选项.
中位数和百分位数的广义轴支持#
np.median 和 np.percentile 现在支持广义轴参数,就像自 1.7 以来 ufunc reductions 所做的那样. 现在可以说 axis=(index, index) 来选择用于缩减的轴列表. 还添加了 keepdims 关键字参数,以允许方便地广播到原始形状的数组.
Dtype 参数添加到 np.linspace 和 np.logspace#
现在可以使用 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#
现在可以获得每个唯一项目在输入中出现的次数作为可选返回值.
支持 nanfunctions 中的中位数和百分位数#
np.nanmedian 和 np.nanpercentile 函数的行为类似于中位数和百分位数函数,但会忽略 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 的准确性.
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#
由于 Python 3 对其文件对象应用了内部缓冲,实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose 已损坏.为了修复此问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并且旧函数已被弃用.由于这些函数的脆弱性,建议尽可能使用 Python API.
此更改已应用于 1.8.1 版本.