NumPy 1.8.0 版本说明#
此版本支持 Python 2.6 -2.7 和 3.2 - 3.3。
亮点#
新功能,无需 2to3,Python 2 和 Python 3 由通用代码库支持。
新功能,用于线性代数的 gufunc,支持对堆叠数组进行操作。
新功能,使用
.at方法对 ufunc 进行原地花式索引。新功能,
partition函数,通过选择进行部分排序以快速计算中位数。新功能,
nanmean、nanvar和nanstd函数,跳过 NaN。新功能,
full和full_like函数,用于创建初始化值为特定值的数组。新功能,
PyUFunc_RegisterLoopForDescr,更好地支持用户定义 dtype 的 ufunc。许多方面都有大量的性能改进。
已弃用支持#
已删除对 Python 版本 2.4 和 2.5 的支持,
已删除对 SCons 的支持。
未来变化#
Datetime64 类型在此版本中仍处于实验阶段。在 1.9 版本中,可能会进行一些更改以使其更易于使用。
Diagonal 方法目前返回一个新数组并引发 FutureWarning。在 1.9 版本中,它将返回一个只读视图。
从结构化类型数组中进行多字段选择目前返回一个新数组并引发 FutureWarning。在 1.9 版本中,它将返回一个只读视图。
numpy/oldnumeric 和 numpy/numarray 兼容模块将在 1.9 版本中删除。
兼容性说明#
doc/sphinxext 内容已移至其自己的 github 仓库,并作为子模块包含在 numpy 中。有关如何访问这些内容,请参阅 doc/HOWTO_BUILD_DOCS.rst 中的说明。
numpy.void 标量的哈希函数已更改。以前,数据指针被哈希为整数。现在,哈希函数使用元组哈希算法来组合标量元素的哈希函数,但仅当标量是只读的时。
Numpy 已将构建系统默认设置为使用“独立编译”。在以前的版本中,这是受支持的,但不是默认设置。这应该会产生与旧系统相同的结果,但如果您尝试执行一些复杂的操作,例如静态链接 numpy 或使用不寻常的编译器,则可能会遇到问题。如果遇到这种情况,请提交 bug,并作为临时解决方法,您可以通过导出 shell 变量 NPY_SEPARATE_COMPILATION=0 来重新启用旧的构建系统。
对于 AdvancedNew 迭代器,oa_ndim 标志现在应为 -1,表示没有传入 op_axes 和 itershape。 oa_ndim == 0 的情况现在表示 0-D 迭代,op_axes 为 NULL,并且旧用法已弃用。这不会影响 NpyIter_New 或 NpyIter_MultiNew 函数。
nanargmin 和 nanargmax 函数现在为所有 NaN 切片中的索引返回 np.iinfo[‘intp’].min。以前,这些函数会为数组返回值引发 ValueError,为标量返回值返回 NaN。
NPY_RELAXED_STRIDES_CHECKING#
有一个新的编译时环境变量 NPY_RELAXED_STRIDES_CHECKING。如果此变量设置为 1,则 numpy 将认为更多数组是 C 或 F contiguous 的——例如,一个列向量可以同时被视为 C 和 F contiguous。新定义更准确,允许进行更少的非必要复制的更快的代码,并简化了 numpy 内部的代码。但是,它也可能破坏对 C 和 F contiguous 数组的 stride 值做出过强假设的第三方库。(目前已知这会破坏使用 memoryview 的 Cython 代码,这将在 Cython 中修复。) THIS WILL BECOME THE DEFAULT IN A FUTURE RELEASE, SO PLEASE TEST YOUR CODE NOW AGAINST NUMPY BUILT WITH
NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install
您可以通过运行以下命令来检查 NPY_RELAXED_STRIDES_CHECKING 是否生效
np.ones((10, 1), order="C").flags.f_contiguous
如果启用了放松的 stride 检查,这将是 True,否则为 False。到目前为止我们看到的典型问题是 C 代码处理 C contiguous 数组,并假定可以通过查看 PyArray_STRIDES(arr) 数组的最后一个元素来访问 itemsize。当启用了放松的 stride 时,这并不成立(事实上,在某些极端情况下,这从来都不是真的)。而是使用 PyArray_ITEMSIZE(arr)。
有关更多信息,请参阅文档中“ndarray 的内部内存布局”部分。
与非数组作为第二个参数的二元运算#
形式为 <array-or-subclass> * <non-array-subclass> 的二元运算,其中 <non-array-subclass> 声明的 __array_priority__ 高于 <array-or-subclass>,现在将无条件返回 NotImplemented,让 <non-array-subclass> 有机会处理该运算。以前,只有当 <non-array-subclass> 实际实现了反向运算,并且在尝试了(可能很昂贵的)数组转换 <non-array-subclass> 之后,才会返回 NotImplemented。(bug,pull request)
与 overwrite_input 一起使用的 median 函数仅部分排序数组#
如果 median 与 overwrite_input 选项一起使用,则输入数组现在将仅部分排序,而不是完全排序。
修复 financial.npv#
npv 函数存在一个 bug。与文档所述相反,它从索引 1 到 M 求和,而不是从 0 到 M - 1 求和。此修复程序更改了返回值。mirr 函数调用了 npv 函数,但绕过了该问题,因此也进行了修复,mirr 函数的返回值保持不变。
比较 NaN 数时的运行时警告#
比较 NaN 浮点数现在会引发 invalid 运行时警告。如果预期存在 NaN,则可以使用 np.errstate 忽略该警告。例如:
with np.errstate(invalid='ignore'):
operation()
新功能#
支持对堆叠数组进行线性代数运算#
gufunc 机制现在用于 np.linalg,支持对堆叠数组和向量进行操作。例如:
>>> a
array([[[ 1., 1.],
[ 0., 1.]],
[[ 1., 1.],
[ 0., 1.]]])
>>> np.linalg.inv(a)
array([[[ 1., -1.],
[ 0., 1.]],
[[ 1., -1.],
[ 0., 1.]]])
ufunc 的原地花式索引#
已将 at 函数添加到 ufunc 对象中,以允许在不进行缓冲的情况下对 ufunc 进行原地操作(使用花式索引)。例如,以下代码将第一个和第二个元素增加 1,并将第三个元素增加两次:numpy.add.at(arr, [0, 1, 2, 2], 1)
这正是许多人错误地认为 arr[[0, 1, 2, 2]] += 1 会执行的操作,但该操作并不能按预期工作,因为 arr[2] 的增量值被简单地复制了两次到 arr 的第三个槽中,而不是增量了两次。
新函数 partition 和 argpartition#
新函数,通过选择算法对数组进行部分排序。
按索引 k 进行 partition 会将第 k 小的元素移到数组的前面。则 k 前面的所有元素都小于或等于 k 位置的值,而 k 后面的所有元素都大于或等于 k 位置的值。这些边界内的值的顺序是未定义的。可以提供一个索引序列来一次性将所有这些索引排好序,进行迭代分区。这可用于有效地获取样本的顺序统计量,如中位数或百分位数。partition 的时间复杂度为线性 O(n),而完全排序的时间复杂度为 O(n log(n))。
新函数 nanmean、nanvar 和 nanstd#
添加了新的 NaN 感知统计函数。在这些函数中,结果将是如果从所有计算中省略 NaN 值所获得的结果。
新函数 full 和 full_like#
新的方便函数,用于创建用特定值填充的数组;与现有的 zeros 和 zeros_like 函数互补。
与大文件的 IO 兼容性#
在 64 位系统上可以加载大于 2GB 的大型 NPZ 文件。
针对 OpenBLAS 进行构建#
现在可以通过编辑 site.cfg 来针对 OpenBLAS 构建 numpy。
新常量#
欧拉常数现在在 numpy 中公开为 euler_gamma。
qr 的新模式#
QR 分解中添加了新的模式“complete”、“reduced”和“raw”,并且旧的“full”和“economic”模式已被弃用。“reduced”模式取代了旧的“full”模式,并且是默认设置,就像“full”模式一样,因此可以通过不指定模式来保持向后兼容性。
“complete”模式返回全维度的分解,这对于获得范围空间正交补的基非常有用。“raw”模式返回包含 Householder 反射器和缩放因子的数组,这些因子可用于将来在不进行矩阵转换的情况下应用 q。“economic”模式只是被弃用了,它的用途不大,而且效率也不比“raw”模式高。
in1d 的新 invert 参数#
in1d 函数现在接受一个 invert 参数,当设置为 True 时,该参数会反转返回的数组。
使用 np.newaxis 进行高级索引#
现在可以使用 np.newaxis/None 与索引数组一起使用,而不仅仅是在简单索引中。这意味着 array[np.newaxis, [0, 1]] 现在将按预期工作,选择前两行,同时在数组前添加一个新轴。
C-API#
现在可以为具有内置输入类型和自定义输出类型的 ufunc 注册新的 ufunc。在此更改之前,当从 Python 调用 ufunc 时,NumPy 无法找到正确的 ufunc 循环函数,因为 ufunc 循环签名匹配逻辑没有检查输出操作数类型。现在可以找到正确的 ufunc 循环,只要用户提供了具有正确输出类型的输出参数。
runtests.py#
添加了一个简单的测试运行器脚本 runtests.py。它还通过 setup.py build 构建 Numpy,并可用于在开发过程中轻松运行测试。
改进#
IO 性能改进#
通过分块(参见 IO 兼容性)改进了读取大文件的性能。
pad 函数的性能改进#
pad 函数有一个新的实现,极大地提高了所有输入的性能,除了 mode=(为保持向后兼容性而保留)。对于维度 >= 4,维度缩放得到显著改进。
isnan、isinf、isfinite 和 byteswap 函数的性能改进#
isnan、isinf、isfinite 和 byteswap 已得到改进,以利用编译器内置函数来避免昂贵的 libc 调用。这使得在 gnu libc 系统上这些操作的性能提高了约一倍。
通过 SSE2 向量化实现的性能改进#
几个函数已优化以利用 SSE2 CPU SIMD 指令。
- Float32 和 float64
基本数学运算(add、subtract、divide、multiply)
sqrt
minimum/maximum
absolute
- Bool
logical_or
logical_and
logical_not
这使得这些操作的性能提高了高达 4 倍/2 倍(float32/float64)和高达 10 倍(bool),具体取决于 CPU 缓存中的数据位置。对于原地操作,性能提升最大。
要使用改进的函数,必须在编译时启用 SSE2 指令集。在 x86_64 系统上默认启用。在具有兼容 CPU 的 x86_32 系统上,必须通过向 CFLAGS 构建变量传递适当的标志(gcc 为 -msse2)来启用它。
median 函数的性能改进#
median 现在是基于 partition 实现的,而不是 sort,这将其时间复杂度从 O(n log(n)) 降低到 O(n)。如果与 overwrite_input 选项一起使用,数组现在将仅部分排序,而不是完全排序。
ufunc C-API 中可覆盖的操作数标志#
创建 ufunc 时,可以通过 ufunc 对象的 new op_flags 属性覆盖默认的 ufunc 操作数标志。例如,要设置第一个输入的**读/写**操作数标志:
PyObject *ufunc = PyUFunc_FromFuncAndData(…); ufunc->op_flags[0] = NPY_ITER_READWRITE;
这允许 ufunc 执行原地操作。此外,可以通过 ufunc 对象的 new iter_flags 属性覆盖全局 nditer 标志。例如,为 ufunc 设置 reduce 标志:
ufunc->iter_flags = NPY_ITER_REDUCE_OK;
更改#
通用#
np.take 函数现在允许使用 0-D 数组作为索引。
独立编译模式现在已默认启用。
np.insert 和 np.delete 的几项更改
以前,负索引和指向数组末尾之后的索引将被简单地忽略。现在,这会引发 Future 或 Deprecation Warning。将来,它们将被视为普通索引的处理方式——负索引将环绕,越界索引将生成错误。
以前,布尔索引被视为整数(始终指向数组的第 0 或第 1 个元素)。将来,它们将被视为掩码。在此版本中,它们将引发关于此即将发生的更改的 FutureWarning。
在 Numpy 1.7 中。np.insert 已经允许使用 np.insert(arr, 3, [1,2,3]) 语法在单个位置插入多个项目。在 Numpy 1.8 中,这也适用于 np.insert(arr, [3], [1, 2, 3])。
np.pad 的填充区域现在被正确四舍五入,而不是截断。
C-API 数组新增#
已向数组 C-API 添加了四个新函数。
PyArray_Partition
PyArray_ArgPartition
PyArray_SelectkindConverter
PyDataMem_NEW_ZEROED
C-API Ufunc 新增#
已向 ufunc C-API 添加了一个新函数,该函数允许使用 descr 为用户类型注册内部循环。
PyUFunc_RegisterLoopForDescr
C-API 开发者改进#
PyArray_Type 实例创建函数 tp_new 现在使用 tp_basicsize 来确定分配多少内存。在以前的版本中,只分配了 sizeof(PyArrayObject) 字节的内存,通常需要 C-API 子类型重新实现 tp_new。
弃用#
qr 分解的“full”和“economic”模式已被弃用。
通用#
已弃用对非整数用作索引和大多数整数参数的使用。以前,浮点索引和函数参数(如 axes 或 shapes)会在没有警告的情况下被截断为整数。例如,arr.reshape(3., -1) 或 arr[0.] 将在 NumPy 1.8 中触发弃用警告,并且在未来的某个 NumPy 版本中,它们将引发错误。