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 数据类型可能被改为表示 Python 字符串而不是字节,在 Python 3 中这两种类型非常不同.

兼容性说明#

diagonal 和 diag 函数返回只读视图.#

在 NumPy 1.8 中,diagonal 和 diag 函数返回的是只读副本,在 NumPy 1.9 中它们返回的是只读视图,而在 1.10 中它们将返回可写视图.

特殊的标量浮点值不会再导致向上转换为双精度#

在之前的 numpy 版本中,涉及包含特殊值 NaNInf-Inf 的浮点标量的操作会导致结果类型至少为 float64.由于特殊值可以在最小的可用浮点类型中表示,因此不再执行向上转换.

例如,以下数据类型:

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 状态 vs. numpy < 1.9#

生成二项随机变量的算法中的一个错误已被修复.这一更改可能会改变执行的随机抽取次数,因此在调用 distribution.c::rk_binomial_btpe 后序列位置将有所不同.任何依赖于 RNG 处于已知状态的测试都应进行检查和/或更新.

随机种子强制为32位无符号整数#

np.random.seednp.random.RandomState 现在如果种子不能安全地转换为 32 位无符号整数,则会抛出 ValueError.现在失败的应用程序可以通过将更高的 32 位值屏蔽为零来修复:seed = seed & 0xFFFFFFFF.这是在旧版本中默默执行的操作,因此随机流保持不变.

Argmin 和 argmax 输出参数#

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 维数组.这意味着 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)将成为合法的 布尔 索引.目前,对于标量数组,这已经是这种情况,以允许在 a 为零维时 positive = a[a > 0] 正常工作.

  • 在 NumPy 1.8 中,可以使用 array(True)array(False) 等同于 1 和 0,如果操作的结果是标量.这在 NumPy 1.9 中将引发错误,并且如上所述,将来会作为布尔索引处理.

  • 所有非整数类数组已被弃用,自定义整数类对象数组可能需要显式转换.

  • 高级索引的错误报告更加详细,然而在某些情况下错误类型已经改变.(索引数组的广播错误报告为 IndexError

  • 使用多个省略号 (...) 进行索引已被弃用.

非整数缩减轴索引已被弃用#

add.reducesum 这样的归约 ufuncs 的非整数轴索引已被弃用.

promote_types 和字符串 dtype#

promote_types 函数现在在给定一个整数或浮点数 dtype 作为一个参数,另一个参数为字符串 dtype 时,返回一个有效的字符串长度.以前它总是返回输入的字符串 dtype,即使它不够长以存储转换为字符串的最大整数/浮点数值.

can_cast 和字符串 dtype#

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

astype 和字符串 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_GetItem`` 和 PySequence_SetItem 会修正负索引,因此它们可以被使用.

NDIter#

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

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

这对当前工作的代码没有影响,但强调了在这些条件可能发生时检查错误返回的必要性.在大多数情况下,被迭代的数组与迭代器一样大,因此不会出现这种问题.

此更改已应用于 1.8.1 版本.

zeros_like 对于字符串数据类型现在返回空字符串#

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

新功能#

Percentile 支持更多的插值选项#

np.percentile 现在有 interpolation 关键字参数,用于指定当百分位数落在两个值之间时,应以何种方式插值.请参阅文档以了解可用的选项.

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

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

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

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

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

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

tobytestostring 方法的别名#

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 函数的行为类似于中位数和百分位数函数,只不过忽略了 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 现在可以正确地广播它的两个输入数组,即使它们具有不同的维度数量.在早期版本中,这会导致错误或计算错误的结果.

改进#

在某些情况下,更好的数值稳定性用于求和#

成对求和现在在求和方法中使用,但仅沿快速轴和长度 <= 8192 的值组使用.这还应提高某些常见情况下 var 和 std 的准确性.

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 模块进行更有效的并行化.最值得注意的是,对于花式索引、np.where 以及 random 模块现在使用每个状态锁而不是全局解释器锁,全局解释器锁现在被释放了.

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

即使 ab 中的数组是同一个对象,也会始终返回 False(并且在将来会返回错误).

相等运算符 == 在未来如果广播或元素比较等失败,将引发像 np.equal 这样的错误.

arr == None 的比较在未来将进行逐元素比较,而不是仅返回 False.代码应使用 arr is None.

所有这些更改目前都会给出弃用警告或未来警告.

C-API#

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

此更改已应用于 1.8.1 版本.