NumPy 1.8.0 版本说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.3。
亮点#
新增:无需 2to3,Python 2 和 Python 3 由共同的代码库支持。
新增:用于线性代数的 gufuncs,支持对堆叠数组进行操作。
新增:使用
.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 或使用不常见的编译器,则可能会遇到问题。如果是这样,请提交错误报告,并且作为临时解决方法,您可以通过导出 shell 变量 NPY_SEPARATE_COMPILATION=0 来重新启用旧的构建系统。
对于 AdvancedNew 迭代器,oa_ndim
标志现在应为 -1,以指示没有传递 op_axes
和 itershape
。 oa_ndim == 0
的情况现在表示 0 维迭代和 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 连续数组的步长值做出过于严格假设的第三方库。(目前已知这会破坏使用 memoryview 的 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)
与 overwrite_input 一起使用的 median 函数仅部分排序数组#
如果 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()
新功能#
支持对堆叠数组进行线性代数运算#
现在 np.linalg 使用 gufunc 机制,允许对堆叠数组和向量进行操作。例如:
>>> 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兼容性#
在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。在此更改之前,当从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对象的新的op_flags属性覆盖默认的ufunc操作数标志。例如,要将第一个输入的操作数标志设置为读/写
PyObject *ufunc = PyUFunc_FromFuncAndData(…); ufunc->op_flags[0] = NPY_ITER_READWRITE;
这允许ufunc就地执行操作。此外,可以通过ufunc对象的新的iter_flags属性覆盖全局nditer标志。例如,要为ufunc设置reduce标志
ufunc->iter_flags = NPY_ITER_REDUCE_OK;
更改#
一般#
np.take函数现在允许使用0维数组作为索引。
现在默认启用单独编译模式。
对np.insert和np.delete的几处更改
以前,负索引和指向数组末尾之外的索引将被简单地忽略。现在,这将引发Future警告或弃用警告。将来,它们将像正常的索引处理方式一样被处理——负索引将循环,超出范围的索引将生成错误。
以前,布尔索引被视为整数(始终引用数组中的第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 的未来某个版本中,它们将引发错误。