NumPy 1.8.0 发行说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.3.
亮点#
新功能,无需 2to3,Python 2 和 Python 3 通过一个通用代码库得到支持.
新的,用于线性代数的广义函数(gufuncs),支持对堆叠数组的操作.
新的,就地花式索引用于带有
.at
方法的通用函数.新功能,
partition
函数, 通过选择进行部分排序以实现快速中位数.新增
nanmean
、nanvar
和nanstd
函数,跳过 NaNs.新增
full
和full_like
函数用于创建值初始化的数组.新功能,
PyUFunc_RegisterLoopForDescr
, 为用户定义的数据类型提供更好的 ufunc 支持.在许多领域进行了大量的性能改进.
停止支持#
已放弃对 Python 2.4 和 2.5 版本的支持,
对SCons的支持已被移除.
未来变化#
Datetime64 类型在此版本中仍然是实验性的.在 1.9 中可能会有一些更改,以使其更易于使用.
对角线方法目前返回一个新数组并引发 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 或使用不寻常的编译器,那么你可能会遇到问题.如果是这样,请提交一个错误报告,并且作为一种临时解决方案,你可以通过导出 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-连续的——例如,可以有一个同时被认为是C-和F-连续的列向量.新的定义更准确,允许更快的代码,减少不必要的复制,并简化numpy的内部代码.然而,它也可能破坏对C-和F-连续数组的步幅值做出过于强假设的第三方库.(目前也已知这会破坏使用内存视图的Cython代码,这将在Cython中修复.)这将成为未来版本的默认设置,因此请现在就测试您的代码,使用以下方式构建的numpy:
NPY_RELAXED_STRIDES_CHECKING=1 python setup.py install
你可以通过运行以下命令来检查 NPY_RELAXED_STRIDES_CHECKING 是否生效:
np.ones((10, 1), order="C").flags.f_contiguous
如果启用了宽松的步幅检查,则为 True
,否则为 False
.到目前为止我们看到的一个典型问题是,使用C连续数组的C代码,并假设可以通过查看 PyArray_STRIDES(arr)
数组中的最后一个元素来访问itemsize.当宽松的步幅生效时,这并不正确(实际上,在一些极端情况下,这从来都不是正确的).相反,使用 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)
函数 median 与 overwrite_input 一起使用时只会部分排序数组#
如果 median 与 overwrite_input 选项一起使用,输入数组现在只会部分排序而不是完全排序.
修复到 financial.npv#
npv 函数有一个错误.与文档所述相反,它从索引 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.]]])
就地花式索引用于通用函数#
函数 at
已添加到 ufunc 对象中,以在使用花式索引时允许无缓冲的就地 ufuncs.例如,以下代码将递增数组中的第一项和第二项,并将第三项递增两次: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兼容性#
大于2GB的大型NPZ文件可以在64位系统上加载.
针对 OpenBLAS 进行构建#
现在可以通过编辑 site.cfg 来构建针对 OpenBLAS 的 numpy.
新常量#
欧拉常数现在在 numpy 中作为 euler_gamma 公开.
qr 的新模式#
新的模式 ‘complete’, ‘reduced’, 和 ‘raw’ 已被添加到 qr 分解中,旧的 ‘full’ 和 ‘economic’ 模式已被弃用.’reduced’ 模式取代了旧的 ‘full’ 模式,并且是默认模式,就像 ‘full’ 模式一样,因此可以通过不指定模式来保持向后兼容性.
‘complete’ 模式返回一个完整的维度分解,这对于获取范围空间的正交补的基是有用的.’raw’ 模式返回包含 Householder 反射器和缩放因子的数组,这些数组可以在将来用于应用 q 而无需转换为矩阵.’economic’ 模式已被弃用,它的用处不大,而且效率也不比 ‘raw’ 模式高.
新的 invert 参数用于 in1d#
函数 in1d 现在接受一个 invert 参数,当该参数为 True 时,返回的数组将被反转.
使用 np.newaxis 进行高级索引#
现在可以使用 np.newaxis/None 与索引数组一起使用,而不仅仅是在简单索引中.这意味着 array[np.newaxis, [0, 1]]
现在将按预期工作,并选择前两行,同时在数组前添加一个新的轴.
C-API#
新的 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
最小/最大
absolute
- Bool:
logical_or
logical_and
logical_not
这提高了这些操作的性能,对于 float32/float64 最高可达 4 倍/2 倍,对于 bool 最高可达 10 倍,具体取决于数据在 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 对象的新 op_flags 属性覆盖默认的 ufunc 操作数标志.例如,要将第一个输入的操作数标志设置为读/写:
PyObject *ufunc = PyUFunc_FromFuncAndData(…); ufunc->op_flags[0] = NPY_ITER_READWRITE;
这允许一个 ufunc 就地执行操作.此外,全局 nditer 标志可以通过 ufunc 对象的新 iter_flags 属性来覆盖.例如,要为 ufunc 设置 reduce 标志:
ufunc->iter_flags = NPY_ITER_REDUCE_OK;
变化#
一般#
函数 np.take 现在允许使用 0-d 数组作为索引.
分离编译模式现在默认启用.
对 np.insert 和 np.delete 的几项更改:
之前,负索引和指向数组末尾之外的索引被简单地忽略.现在,这将引发一个未来或弃用警告.在未来,它们将被视为正常索引处理——负索引将环绕,越界索引将生成一个错误.
之前,布尔索引被当作整数处理(总是引用数组中的第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’ 模式已弃用.
一般#
对于索引和大多数整数参数使用非整数已被弃用.以前,浮点索引和函数参数(如轴或形状)在没有警告的情况下被截断为整数.例如 arr.reshape(3., -1) 或 arr[0.] 将在 NumPy 1.8 中触发弃用警告,并且在 NumPy 的未来版本中它们将引发错误.