NumPy 1.4.0 发布说明#

此小版本包含许多错误修复,以及一些新功能.它与1.3.0版本向后兼容.

亮点#

  • 新的日期时间数据类型支持,用于处理数组中的日期

  • 更快的导入时间

  • 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 中当前的 polynomial 支持不兼容,但与新的 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. 排序函数现在将 nans 排序到末尾.

    • 实际排序顺序是 [R, nan]

    • 复杂的排序顺序是 [R + Rj, R + nanj, nan + Rj, nan + nanj]

    具有相同 nan 位置的复数根据存在的非 nan 部分进行排序.

  3. 类型比较函数已经与新的 nans 排序顺序保持一致.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 兼容.此外,复数通用函数现在使用平台 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