NumPy 1.8.0 发行说明#
此版本支持 Python 2.6 -2.7 和 3.2 - 3.3.
亮点#
新增功能,无需 2to3,一个通用代码库支持 Python 2 和 Python 3.
新增功能,用于线性代数的 gufuncs,支持对堆叠数组进行操作.
新增功能,通过
.at方法为 ufuncs 提供就地花式索引.新增功能,
partition函数,通过选择进行部分排序,以实现快速中位数计算.新增功能,跳过 NaN 值的
nanmean,nanvar和nanstd函数.新增功能,
full和full_like函数用于创建值初始化的数组.新增功能,
PyUFunc_RegisterLoopForDescr,更好地支持用户 dtypes 的 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 或使用不寻常的编译器,那么您可能会遇到问题. 如果是这样,请提交错误报告,作为临时解决方法,您可以通过导出 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 现在为 all-NaN 切片中的索引返回 np.iinfo[‘intp’].min. 以前,这些函数将为数组返回引发 ValueError,为标量返回引发 NaN.
NPY_RELAXED_STRIDES_CHECKING#
现在有一个新的编译时环境变量 NPY_RELAXED_STRIDES_CHECKING .如果这个变量设置为1,那么numpy会认为更多的数组是C或F连续的 – 例如,它变成了有可能有一个列向量同时被认为是C和F连续的. 新的定义更准确,允许更快的代码,减少不必要的复制,并简化numpy内部的代码. 然而,它也可能破坏第三方库,这些库对C和F连续数组的步长值做了过于强的假设.(目前已知这会破坏使用memoryviews的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) 数组中的最后一个元素来访问项目大小.当宽松的步幅生效时,这不成立(事实上,在某些极端情况下也从来没有成立过).相反,请使用 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,而无需缓冲.例如,以下命令将递增数组中的第一项和第二项,并且将递增第三项两次: 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.
新常量#
欧拉常数现在作为 euler_gamma 在 numpy 中公开.
qr 的新模式#
已将新模式“complete”,“reduced”和“raw”添加到 qr 分解中,并且旧的“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. 在此更改之前,当从 Python 调用 ufunc 时,NumPy 无法找到正确的 ufunc 循环函数,因为 ufunc 循环签名匹配逻辑没有查看输出操作数类型. 现在可以找到正确的 ufunc 循环,只要用户提供具有正确输出类型的输出参数即可.
runtests.py#
添加了一个简单的测试运行器脚本 runtests.py . 它还通过 setup.py build 构建 Numpy,并且可以在开发期间轻松地运行测试.
改进#
IO 性能改进#
通过分块提高了读取大型文件的性能(另请参见 IO 兼容性).
pad 的性能改进#
pad 函数有一个新的实现,大大提高了除 mode= 之外的所有输入的性能(为向后兼容性而保留). 对于 rank >= 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
这可以将 float32/float64 的这些操作的性能提高到 4x/2x,对于 bool,则可以提高到 10x,具体取决于 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 的一些更改:
以前,负索引和指向数组末尾之后的索引会被简单地忽略.现在,这将引发 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”模式已被弃用.
通用#
对于索引和大多数整数参数使用非整数已被弃用. 以前,浮点索引和函数参数(如轴或形状)会被截断为整数,而不会发出警告. 例如, arr.reshape(3., -1) 或 arr[0.] 将在 NumPy 1.8 中触发弃用警告,并且在 NumPy 的将来的某个版本中,它们会引发错误.