NumPy 1.4.0 版本说明#
此小版本包含许多错误修复以及一些新功能。它与 1.3.0 版本向后兼容。
亮点#
新增 datetime 数据类型支持,用于处理数组中的日期。
更快的导入时间
扩展了 ufunc 的数组包装机制
新的邻域迭代器(仅限 C 级别)
npymath 中类似 C99 的复数函数
新功能#
扩展了 ufunc 的数组包装机制#
已向 ndarray 添加了一个 `__array_prepare__` 方法,为子类提供了更大的灵活性来与 ufunc 和类似 ufunc 的函数进行交互。ndarray 已经提供了 `__array_wrap__`,它允许子类设置结果的数组类型并在 ufunc 的输出过程中填充元数据(如 MaskedArray 的实现中所示)。对于某些应用程序,需要在输入过程中进行检查和填充元数据。因此,`__array_prepare__` 在 ufunc 初始化输出数组但计算结果和填充它之前被调用。这样,可以在修改数据之前进行检查并引发错误。
自动检测向前不兼容性#
以前,如果扩展程序针对 NumPy 的 N 版本构建,并在具有 NumPy M < N 的系统上使用,则 `import_array` 成功,这可能会导致崩溃,因为 M 版本中没有 N 版本中的函数。从 NumPy 1.4.0 开始,这将导致 `import_array` 失败,因此错误将在早期被捕获。
新的迭代器#
一个新的邻域迭代器已添加到 C API。它可以用于迭代数组邻域中的项目,并且可以自动处理边界条件。零填充和一填充可用,以及任意常数值、镜像和循环填充。
新的多项式支持#
新增了 `chebyshev` 和 `polynomial` 模块。新的 `polynomial` 模块与 NumPy 中当前的多项式支持不兼容,但非常类似于新的 `chebyshev` 模块。对于大多数人来说,最明显的区别在于系数是从低次幂到高次幂指定的,低级函数不使用 Chebyshev 和 Polynomial 类作为参数,并且 Chebyshev 和 Polynomial 类包含一个域。域之间的映射是线性替换,这两个类可以相互转换,例如,一个域中的 Chebyshev 级数可以扩展为另一个域中的多项式。通常应该使用新的类而不是低级函数,后者是为那些希望构建自己类的人提供的。
新的模块不会自动导入到 NumPy 命名空间中,必须使用“`import numpy.polynomial`”语句显式导入。
新的 C API#
以下 C 函数已添加到 C API
`PyArray_GetNDArrayCFeatureVersion`:返回加载的 NumPy 的 API 版本。
`PyArray_Correlate2` - 类似于 `PyArray_Correlate`,但实现了通常的相关性定义。输入不会交换,并且对于复数数组会取共轭。
`PyArray_NeighborhoodIterNew` - 一个新的迭代器,用于迭代某一点的邻域,并自动处理边界。它在 C-API 参考的迭代器部分有文档记录,你可以在 NumPy.core 中的 `multiarray_test.c.src` 文件中找到一些示例。
新的 ufunc#
以下 ufunc 已添加到 C API
`copysign` - 返回第一个参数的值,其符号从第二个参数复制。
`nextafter` - 返回第一个参数朝向第二个参数的下一个可表示浮点数。
新的定义#
alpha 处理器现在已定义,可在 `numpy/npy_cpu.h` 中使用。PARISC 处理器的失败检测已修复。定义如下:
`NPY_CPU_HPPA`:PARISC
`NPY_CPU_ALPHA`:Alpha
测试#
`deprecated` 装饰器:此装饰器可用于避免在测试 `DeprecationWarning` 由装饰的测试有效引发时使测试输出混乱。
`assert_array_almost_equal_nulp`:比较两个浮点值数组的新方法。使用此函数,如果两者之间没有很多可表示的浮点数,则认为两个值接近,因此在值波动很大时比 `assert_array_almost_equal` 更健壮。
`assert_array_max_ulp`:如果两个浮点值之间存在超过 N 个可表示的数字,则引发断言。
`assert_warns`:如果可调用对象没有生成适当类别的警告,则引发 `AssertionError`,而不会更改警告状态。
重用 npymath#
在 1.3.0 中,我们开始将可移植的 C 数学例程放入 npymath 库中,以便人们可以使用这些例程来编写可移植的扩展。不幸的是,不可能轻松地链接到此库:在 1.4.0 中,已向 numpy.distutils 添加了支持,以便第三方可以重用此库。有关更多信息,请参阅 coremath 文档。
改进的集合运算#
在以前版本的 NumPy 中,某些集合函数(`intersect1d`、`setxor1d`、`setdiff1d` 和 `setmember1d`)如果输入数组包含重复项,则可能返回不正确的结果。现在,对于包含重复项的输入数组,这些函数可以正常工作。`setmember1d` 已重命名为 `in1d`,因为随着接受包含重复项的数组的变化,它不再是集合运算,并且在概念上类似于 Python 运算符“in”的逐元素版本。所有这些函数现在都接受布尔关键字 `assume_unique`。默认情况下为 `False`,但如果已知输入数组不包含重复项,则可以将其设置为 `True`,这可以提高函数的执行速度。
改进#
NumPy 导入速度明显加快(根据平台和计算机的不同,提高了 20% 到 30%)
排序函数现在将 NaN 排序到最后。
实数排序顺序为 [R, nan]
复数排序顺序为 [R + Rj, R + nanj, nan + Rj, nan + nanj]
具有相同 NaN 位置的复数根据存在的非 NaN 部分排序。
类型比较函数已与 NaN 的新排序顺序保持一致。`searchsorted` 现在可以使用包含 NaN 值的已排序数组。
复数除法对溢出的抵抗力更强。
复数地板除对溢出的抵抗力更强。
弃用#
以下函数已被弃用
`correlate`:它采用新的关键字参数 `old_behavior`。当为 `True`(默认值)时,它返回与以前相同的结果。当为 `False` 时,计算常规相关性,并对复数数组取共轭。旧行为将在 NumPy 1.5 中删除,并在 1.4 中引发 `DeprecationWarning`。
`unique1d`:改用 `unique`。`unique1d` 在 1.4 中引发弃用警告,并将在 1.5 中删除。
`intersect1d_nu`:改用 `intersect1d`。`intersect1d_nu` 在 1.4 中引发弃用警告,并将在 1.5 中删除。
`setmember1d`:改用 `in1d`。`setmember1d` 在 1.4 中引发弃用警告,并将在 1.5 中删除。
以下操作会引发错误
在对 0 维数组进行操作时,`numpy.max` 等函数仅接受 `axis=0`、`axis=-1` 和 `axis=None`。使用越界的轴表示存在错误,因此 NumPy 现在会为此类情况引发错误。
不再允许指定 `axis > MAX_DIMS`;NumPy 现在会引发错误,而不是像 `axis=None` 一样。
内部更改#
在可用时使用 C99 复数函数#
NumPy 复数类型现在保证与 C99 复数类型兼容(如果平台可用)。此外,复数 ufunc 现在使用平台 C99 函数而不是我们自己的函数。
拆分 multiarray 和 umath 源代码#
multiarray 和 umath 的源代码已拆分为单独的逻辑编译单元。这应该使源代码更适合新手。
单独编译#
默认情况下,multiarray(和 umath)的每个文件都会像以前一样合并成一个文件进行编译,但如果 `NPY_SEPARATE_COMPILATION` 环境变量设置为非负值,则会启用每个文件的实验性单独编译。这在处理核心 NumPy 时会使编译/调试周期快得多。
单独的核心数学库#
已添加的新函数
`npy_copysign`
`npy_nextafter`
`npy_cpack`
`npy_creal`
`npy_cimag`
`npy_cabs`
`npy_cexp`
`npy_clog`
`npy_cpow`
`npy_csqr`
`npy_ccos`
`npy_csin`