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

  1. `PyArray_GetNDArrayCFeatureVersion`:返回加载的 NumPy 的 API 版本。

  2. `PyArray_Correlate2` - 类似于 `PyArray_Correlate`,但实现了通常的相关性定义。输入不会交换,并且对于复数数组会取共轭。

  3. `PyArray_NeighborhoodIterNew` - 一个新的迭代器,用于迭代某一点的邻域,并自动处理边界。它在 C-API 参考的迭代器部分有文档记录,你可以在 NumPy.core 中的 `multiarray_test.c.src` 文件中找到一些示例。

新的 ufunc#

以下 ufunc 已添加到 C API

  1. `copysign` - 返回第一个参数的值,其符号从第二个参数复制。

  2. `nextafter` - 返回第一个参数朝向第二个参数的下一个可表示浮点数。

新的定义#

alpha 处理器现在已定义,可在 `numpy/npy_cpu.h` 中使用。PARISC 处理器的失败检测已修复。定义如下:

  1. `NPY_CPU_HPPA`:PARISC

  2. `NPY_CPU_ALPHA`:Alpha

测试#

  1. `deprecated` 装饰器:此装饰器可用于避免在测试 `DeprecationWarning` 由装饰的测试有效引发时使测试输出混乱。

  2. `assert_array_almost_equal_nulp`:比较两个浮点值数组的新方法。使用此函数,如果两者之间没有很多可表示的浮点数,则认为两个值接近,因此在值波动很大时比 `assert_array_almost_equal` 更健壮。

  3. `assert_array_max_ulp`:如果两个浮点值之间存在超过 N 个可表示的数字,则引发断言。

  4. `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`,这可以提高函数的执行速度。

改进#

  1. NumPy 导入速度明显加快(根据平台和计算机的不同,提高了 20% 到 30%)

  2. 排序函数现在将 NaN 排序到最后。

    • 实数排序顺序为 [R, nan]

    • 复数排序顺序为 [R + Rj, R + nanj, nan + Rj, nan + nanj]

    具有相同 NaN 位置的复数根据存在的非 NaN 部分排序。

  3. 类型比较函数已与 NaN 的新排序顺序保持一致。`searchsorted` 现在可以使用包含 NaN 值的已排序数组。

  4. 复数除法对溢出的抵抗力更强。

  5. 复数地板除对溢出的抵抗力更强。

弃用#

以下函数已被弃用

  1. `correlate`:它采用新的关键字参数 `old_behavior`。当为 `True`(默认值)时,它返回与以前相同的结果。当为 `False` 时,计算常规相关性,并对复数数组取共轭。旧行为将在 NumPy 1.5 中删除,并在 1.4 中引发 `DeprecationWarning`。

  2. `unique1d`:改用 `unique`。`unique1d` 在 1.4 中引发弃用警告,并将在 1.5 中删除。

  3. `intersect1d_nu`:改用 `intersect1d`。`intersect1d_nu` 在 1.4 中引发弃用警告,并将在 1.5 中删除。

  4. `setmember1d`:改用 `in1d`。`setmember1d` 在 1.4 中引发弃用警告,并将在 1.5 中删除。

以下操作会引发错误

  1. 在对 0 维数组进行操作时,`numpy.max` 等函数仅接受 `axis=0`、`axis=-1` 和 `axis=None`。使用越界的轴表示存在错误,因此 NumPy 现在会为此类情况引发错误。

  2. 不再允许指定 `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`