NumPy 1.9.0 发行说明#

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

亮点#

  • 在各个领域进行了大量的性能改进,最值得注意的是,索引和小数组上的操作速度明显加快.索引操作现在也释放 GIL.

  • 添加了 nanmediannanpercentile 来完善 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.seednp.random.RandomState 现在会引发 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-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.reducesum .

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_itemsq_ass_item 序列方法中的负索引#

当直接访问用于项目获取的 sq_itemsq_ass_item PyObject 槽时,将不再支持负索引. 但是, PySequence_GetItemPySequence_SetItem 修复了负索引,以便可以在那里使用它们.

NDIter#

现在调用 NpyIter_RemoveAxis 时,迭代器范围将被重置.

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

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

此更改已应用于 1.8.1 版本.

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

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

新特性#

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

np.percentile 现在具有插值关键字参数,用于指定如果百分位数落在两个值之间,应该以哪种方式插值点. 请参阅文档以获取可用选项.

中位数和百分位数的广义轴支持#

np.mediannp.percentile 现在支持广义轴参数,就像自 1.7 以来 ufunc reductions 所做的那样. 现在可以说 axis=(index, index) 来选择用于缩减的轴列表. 还添加了 keepdims 关键字参数,以允许方便地广播到原始形状的数组.

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

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

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

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

tobytes 作为 tostring 方法的别名#

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

构建系统#

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

与 python numbers 模块的兼容性#

所有数值 numpy 类型现在都在 python numbers 模块中的类型层次结构中注册.

increasing 参数添加到 np.vander#

可以使用这个新的布尔参数指定 Vandermonde 矩阵的列的顺序.

unique_counts 参数添加到 np.unique#

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

支持 nanfunctions 中的中位数和百分位数#

np.nanmediannp.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.whererandom 模块现在使用每个状态锁而不是 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

即使 ab 中的数组是同一个对象,也会始终返回 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 版本.