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 中返回可写视图。
在 Python 3 中,S 和/或 a 数据类型可能会更改为表示 Python 字符串而不是字节,这两种类型非常不同。
兼容性说明#
diagonal 和 diag 函数返回只读视图。#
在 NumPy 1.8 中,diagonal 和 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 索引在此版本中进行了彻底重写。这使得大多数高级整数索引操作大大加快,并且应该没有其他影响。然而,高级索引操作中引入了一些细微的更改和弃用。
对标量数组进行布尔索引将始终返回一个新的 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.reduce 或 sum 等规约 ufunc 的非整数轴索引已弃用。
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
方法现在会在“安全”类型转换模式下,如果目标字符串 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 版本。
字符串 dtype 的 zeros_like
现在返回空字符串#
为了与 zeros 函数匹配,zeros_like 现在返回用空字符串初始化的数组,而不是填充 ‘0’ 的数组。
新特性#
百分位数支持更多插值选项#
np.percentile
现在具有 interpolation 关键字参数,用于指定如果百分位数介于两个值之间,应如何插值。有关可用选项,请参阅文档。
中位数和百分位数支持泛化轴#
np.median
和 np.percentile
现在支持泛化轴参数,就像 1.7 版本以来的 ufunc 规约一样。现在可以说 axis=(index, index) 来选择用于规约的轴列表。还添加了 keepdims
关键字参数,以方便广播到原始形状的数组。
np.linspace
和 np.logspace
添加了 Dtype 参数#
linspace
和 logspace
函数返回的数据类型现在可以使用 dtype 参数指定。
更通用的 np.triu
和 np.tril
广播#
对于 ndim
超过 2 的数组,这些函数现在将应用于最后两个轴,而不是引发异常。
tostring
方法的 tobytes
别名#
已添加 ndarray.tobytes
和 MaskedArray.tobytes
作为 tostring
的别名,用于将数组导出为 bytes
。这在 Python 3 中更加一致,因为 str
和 bytes
是不同的。
构建系统#
增加了对 ppc64le 和 OpenRISC 架构的实验性支持。
与 Python numbers
模块的兼容性#
所有 NumPy 数值类型现在都已在 Python numbers
模块的类型层次结构中注册。
np.vander
添加了 increasing
参数#
范德蒙矩阵列的顺序可以通过这个新的布尔参数指定。
np.unique
添加了 unique_counts
参数#
现在可以作为可选返回值获取每个唯一项在输入中出现的次数。
nan 函数中对中位数和百分位数的支持#
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 方法中使用成对求和,但仅限于沿快速轴以及长度小于等于 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 释放#
现在有更多函数释放了全局解释器锁 (GIL),允许使用 threading
模块进行更高效的并行化。最值得注意的是,现在为花式索引、np.where
释放了 GIL,并且 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
将始终返回 False(将来会引发错误),即使 a 和 b 中的数组是同一个对象。
相等运算符 == 将来如果广播或元素比较等失败,将像 np.equal 一样引发错误。
将来,与 arr == None 的比较将进行逐元素比较,而不是直接返回 False。代码应该使用 arr is None。
所有这些更改目前都会发出 DeprecationWarning 或 FutureWarning。
C-API#
实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose 由于 Python 3 对其文件对象应用的内部缓冲而损坏。为了解决此问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并且旧函数已弃用。由于这些函数的脆弱性,建议在可能的情况下使用 Python API。
此更改已应用于 1.8.1 版本。