NumPy 1.4.0 Release Notes#

本次小版本更新包含大量错误修复和一些新功能。它向后兼容 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 文件中找到一些示例。

新的 ufuncs#

以下 ufuncs 已添加到 C API 中

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

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

新的定义#

alpha 处理器现在已定义并在 numpy/npy_cpu.h 中可用。PA R ISC 处理器的检测失败已修复。定义如下:

  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. sort 函数现在会将 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-d 数组进行操作时,`numpy.max` 和其他函数仅接受 `axis=0`、`axis=-1` 和 `axis=None`。使用越界的轴表示存在错误,因此 Numpy 现在会为这些情况引发错误。

  2. 指定 `axis > MAX_DIMS` 不再允许;Numpy 现在会引发错误,而不是像 `axis=None` 那样表现。

内部更改#

在可用时使用 C99 复数函数#

现在保证 numpy 复数类型与 C99 复数类型在 ABI 上兼容(如果平台上可用)。此外,复数 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