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 中
PyArray_GetNDArrayCFeatureVersion: 返回已加载 numpy 的*API*版本。
PyArray_Correlate2 - 类似于 PyArray_Correlate,但实现了常规的卷积定义。输入不交换,并对复数数组取共轭。
PyArray_NeighborhoodIterNew - 一个新的迭代器,用于迭代某点周围的邻域,并自动处理边界。它在 C-API 参考的迭代器部分有文档说明,您可以在 numpy.core 的 multiarray_test.c.src 文件中找到一些示例。
新的 ufuncs#
以下 ufuncs 已添加到 C API 中
copysign - 返回第一个参数的值,符号从第二个参数复制。
nextafter - 返回第一个参数向第二个参数方向的下一个可表示浮点数值。
新的定义#
alpha 处理器现在已定义并在 numpy/npy_cpu.h 中可用。PA R ISC 处理器的检测失败已修复。定义如下:
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%)
sort 函数现在会将 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-d 数组进行操作时,`numpy.max` 和其他函数仅接受 `axis=0`、`axis=-1` 和 `axis=None`。使用越界的轴表示存在错误,因此 Numpy 现在会为这些情况引发错误。
指定 `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