NumPy 1.4.0 发布说明#

此次小版本更新包含了大量错误修复和一些新功能。它与 1.3.0 版本向后兼容。

亮点#

  • 新增 datetime dtype 支持,用于处理数组中的日期

  • 更快的导入时间

  • ufuncs 的扩展数组封装机制

  • 新的邻域迭代器(仅限 C 级别)

  • npymath 中类似 C99 的复数函数

新功能#

ufuncs 的扩展数组封装机制#

ndarray 中添加了 `__array_prepare__` 方法,为子类提供了更大的灵活性,使其能够与 ufuncs 和类似 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 中定义并可用。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 部分,则根据非 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=0axis=-1axis=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