NumPy 1.8.0 发行说明#
此版本支持 Python 2.6 -2.7 和 3.2 - 3.3。
强调#
新的,没有 2to3,Python 2 和 Python 3 由通用代码库支持。
用于线性代数的新 gufuncs,支持对堆叠数组进行操作。
使用该方法对 ufunc 进行新的就地索引
.at
。新
partition
功能,通过选择快速中位数进行部分排序。新的、
nanmean
、nanvar
、 和nanstd
函数跳过 NaN。用于创建值初始化数组的新
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
被传入。这种
情况,现在指示 0 维迭代并且为 NULL,并且旧用法已被弃用。这不会影响或
功能。oa_ndim == 0
op_axes
NpyIter_New
NpyIter_MultiNew
函数 nanargmin 和 nanargmax 现在返回 np.iinfo['intp'].min 作为全 NaN 切片中的索引。以前,这些函数会在数组返回时引发 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 代码,并假设可以通过查看数组中的最后一个元素来访问 itemsize PyArray_STRIDES(arr)
。当放松的步伐生效时,情况并非如此(事实上,在某些极端情况下,情况并非如此)。相反,使用
PyArray_ITEMSIZE(arr)
.
有关更多信息,请查看文档中的“ndarray 的内部内存布局”部分。
以非数组作为第二个参数的二元运算#
where声明的值高于 of 的形式的二元运算现在将无条件返回
NotImplemented,从而有机会处理该操作。以前,只有在实际实现了相反的操作并且尝试了(可能昂贵的)数组转换之后,才会返回
NotImplemented 。 (错误,拉取请求)<array-or-subclass> * <non-array-subclass>
<non-array-subclass>
__array_priority__
<array-or-subclass>
<non-array-subclass>
<non-array-subclass>
<non-array-subclass>
与overwrite_input一起使用的函数中位数仅对数组进行部分排序#
如果中位数与overwrite_input选项一起使用,则输入数组现在将仅部分排序而不是完全排序。
修复 Financial.npv #
npv 函数有一个错误。与文档所述相反,它从索引1
toM
而不是 from 0
to求和。该修复更改了返回值。 mirr 函数调用了 npv 函数,但解决了该问题,因此该问题也得到了修复,并且 mirr 函数的返回值保持不变。M - 1
比较 NaN 数字时的运行时警告#
现在比较NaN
浮点数会引发invalid
运行时警告。如果NaN
需要 a ,则可以使用 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.]]])
为 ufuncs 建立精美索引#
该函数at
已添加到 ufunc 对象中,以便在使用花式索引时允许就地使用 ufunc,而无需缓冲。例如,以下代码将递增数组中的第一项和第二项,并将第三项递增两次:numpy.add.at(arr, [0, 1, 2, 2], 1)
这是许多人错误地认为会做的事情,但这不起作用,因为递增的值只是两次复制到第三个槽中,而不是递增两次。arr[[0, 1, 2, 2]] += 1
arr[2]
arr
新函数partition和argpartition #
通过选择算法对数组进行部分排序的新函数。
partition
按索引将最小元素k
移动k
到数组的前面。前面的所有元素k
都小于或等于position 中的值k
,后面的所有元素k
都大于或等于position 中的值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 的新模式#
新模式“完整”、“简化”和“原始”已添加到 qr 分解中,旧的“完整”和“经济”模式已被弃用。 “缩减”模式取代了旧的“完整”模式,并且与“完整”模式一样是默认模式,因此可以通过不指定模式来保持向后兼容性。
“完整”模式返回全维分解,这对于获得范围空间的正交补集的基础很有用。 “原始”模式返回包含 Householder 反射器和缩放因子的数组,这些数组可以在将来用于应用 q,而无需转换为矩阵。 “经济”模式已被弃用,它没有太多用处,而且并不比“原始”模式更有效。
in1d的新反转参数#
函数in1d现在接受一个invert参数,当该参数为True时,会导致返回的数组反转。
使用np.newaxis进行高级索引#
现在可以将np.newaxis / None与索引数组一起使用,而不仅仅是在简单索引中。这意味着
现在将按预期工作并选择前两行,同时在数组前面添加一个新轴。array[np.newaxis, [0, 1]]
C-API #
现在可以使用内置输入类型和自定义输出类型注册新的 ufunc。在此更改之前,当从 Python 调用 ufunc 时,NumPy 将无法找到正确的 ufunc 循环函数,因为 ufunc 循环签名匹配逻辑不查看输出操作数类型。现在,只要用户提供具有正确输出类型的输出参数,就可以找到正确的 ufunc 循环。
运行测试.py #
runtests.py
添加了一个简单的测试运行脚本。它还通过构建 Numpy
,可用于在开发过程中轻松运行测试。setup.py build
改进#
IO 性能改进#
通过分块提高了读取大文件的性能(另请参阅 IO 兼容性)。
焊盘性能改进#
pad函数有一个新的实现,大大提高了除mode=之外的所有输入的性能(保留是为了向后兼容)。对于等级 >= 4,维度缩放得到显着改善。
isnan、isinf、isfinite和byteswap的性能改进#
isnan、isinf、isfinite和byteswap已得到改进,可以利用编译器内置函数来避免对 libc 的昂贵调用。在 gnu libc 系统上,这将这些操作的性能提高了大约两倍。
通过 SSE2 矢量化提高性能#
多项功能已针对 SSE2 CPU SIMD 指令的使用进行了优化。
- Float32 和 float64:
基础数学(加、减、除、乘)
开方
最小值/最大值
绝对
- 布尔:
逻辑或
逻辑与
逻辑非
这使得这些操作的性能对于 float32/float64 提高了 4 倍/2 倍,对于 bool 提高了 10 倍,具体取决于 CPU 缓存中数据的位置。就地操作的性能增益最大。
为了使用改进的功能,必须在编译时启用 SSE2 指令集。它在 x86_64 系统上默认启用。在具有功能 CPU 的 x86_32 上,必须通过将适当的标志传递给 CFLAGS 构建变量(带有 gcc 的 -msse2)来启用它。
性能提升至中位数#
现在中位数是根据分区而不是排序来实现的,这将其时间复杂度从 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 设置归约标志:
ufunc->iter_flags = NPY_ITER_REDUCE_OK;
变化#
一般的#
函数 np.take 现在允许 0 维数组作为索引。
现在默认启用单独编译模式。
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_分区
PyArray_ArgPartition
PyArray_SelectkindConverter
PyDataMem_NEW_ZEROED
C-API Ufunc 添加#
ufunc C-API 中添加了一个新函数,允许使用 descr 为用户类型注册内部循环。
PyUFunc_RegisterLoopForDecr
C-API 开发人员改进#
实例PyArray_Type
创建函数tp_new
现在用于tp_basicsize
确定要分配多少内存。在以前的版本中,仅sizeof(PyArrayObject)
分配了字节内存,通常需要 C-API 子类型来重新实现tp_new
.
弃用#
qr 分解的“完整”和“经济”模式已被弃用。
一般的#
不推荐使用非整数作为索引和大多数整数参数。以前,浮点索引和函数参数(例如轴或形状)会在没有警告的情况下被截断为整数。例如, arr.reshape(3., -1)或arr[0.]将在 NumPy 1.8 中触发弃用警告,并且在 NumPy 的某些未来版本中它们将引发错误。