NumPy 1.7.0 发行说明#

此版本包含多项新功能以及众多错误修复和重构。它支持 Python 2.4 - 2.7 和 3.1 - 3.3,并且是支持 Python 2.4 - 2.5 的最后一个版本。

亮点#

  • where= 参数到 ufuncs(允许使用布尔数组选择计算执行的位置)

  • vectorize 改进(添加了 'excluded' 和 'cache' 关键字,一般清理和错误修复)

  • numpy.random.choice(随机样本生成函数)

兼容性说明#

在 NumPy 的未来版本中,函数 np.diagnp.diagonal 和 ndarrays 的 diagonal 方法将返回原始数组的一个视图,而不是像现在一样生成一个副本。如果您写入这些函数返回的数组,这将有所不同。为方便此过渡,如果 NumPy 1.7 检测到您可能尝试写入此类数组,它将生成一个 FutureWarning。有关详细信息,请参阅 np.diagonal 的文档。

与上述 np.diagonal 类似,在 NumPy 的未来版本中,通过字段名列表索引记录数组将返回原始数组的一个视图,而不是像现在一样生成一个副本。与 np.diagonal 一样,如果 NumPy 1.7 检测到您可能尝试写入此类数组,它将生成一个 FutureWarning。有关详细信息,请参阅数组索引的文档。

在 NumPy 的未来版本中,UFunc out= 参数的默认类型转换规则将从 'unsafe' 更改为 'same_kind'。(这也适用于原地操作,如 a += b,它等同于 np.add(a, b, out=a)。)大多数违反 'same_kind' 规则的用法可能都是错误,因此此更改可能会暴露依赖 NumPy 的项目中以前未检测到的错误。在此版本的 NumPy 中,此类用法将继续成功执行,但会引发 DeprecationWarning

全数组布尔索引已优化,使用不同的、优化的代码路径。此代码路径应产生相同的结果,但我们欢迎您提供关于代码更改的任何反馈。

尝试写入只读数组(即 arr.flags.writeable 设置为 False 的数组)以前会根据所采取的代码路径不一致地引发 RuntimeErrorValueErrorTypeError。现在它始终引发 ValueError

ufunc>.reduce 函数现在以与之前 NumPy 版本不同的顺序评估一些归约操作,通常能提供更高的性能。由于浮点运算的性质,这可能会微妙地改变一些结果,就像将 NumPy 链接到不同的 BLAS 实现(如 MKL)一样。

如果从 1.5 升级,那么在 1.6 和 1.7 中,总体而言添加了大量代码并更改了一些代码路径,尤其是在类型解析和通用函数上的缓冲迭代方面。这可能会对您的代码产生影响,特别是如果您过去依赖于意外行为的话。

新功能#

归约 UFuncs 泛化 axis= 参数#

任何 ufunc.reduce 函数调用,以及 sumprodanyallmaxmin 等其他归约操作,都支持选择要归约的轴的子集。以前,可以说 axis=None 表示所有轴,或 axis=# 选择单个轴。现在,也可以说 axis=(#,#) 选择一个轴列表进行归约。

归约 UFuncs 新增 keepdims= 参数#

新增了一个 keepdims= 参数,如果设置为 True,则不会丢弃归约轴,而是将它们的大小设置为一。当此选项设置后,归约结果将正确地广播到被归约的原始操作数。

日期时间支持#

注意

datetime API 在 1.7.0 版本中是实验性的,在 NumPy 的未来版本中可能会发生变化。

与 NumPy 1.6 相比,datetime64 进行了大量修复和增强

  • 解析器对仅接受 ISO 8601 日期非常严格,带有一些便捷扩展

  • 在单位之间正确转换

  • 日期时间算术运算正确

  • 工作日功能(允许在仅某些工作日有效的情况下使用日期时间)

有关更多详细信息,应查阅 doc/source/reference/arrays.datetime.rst 中的说明(也可在线文档 arrays.datetime.html 中获取)。

用于打印数组的自定义格式化程序#

请参阅 numpy.set_printoptions 函数的新 formatter 参数。

新函数 numpy.random.choice#

已添加一个通用采样函数,它将从给定类数组中生成样本。样本可以是有放回或无放回的,并且可以是均匀概率或给定非均匀概率的。

新函数 isclose#

返回一个布尔数组,其中两个数组在容差范围内逐元素相等。可以指定相对容差和绝对容差。

多项式包中的初步多维支持#

积分和微分函数中添加了轴关键字,评估函数中添加了张量关键字。这些添加允许在这些函数中使用多维系数数组。同时添加了用于在网格或点集上评估二维和三维系数数组的新函数,以及可用于拟合的二维和三维伪范德蒙矩阵。

填充 N 维数组的能力#

已添加一个包含用于填充 N 维数组的函数的 pad 模块。各种私有填充函数作为公共 'pad' 函数的选项公开。例如

pad(a, 5, mode='mean')

当前模式包括 constantedgelinear_rampmaximummeanmedianminimumreflectsymmetricwrap<function>

searchsorted 的新参数#

函数 searchsorted 现在接受一个 'sorter' 参数,它是一个用于排序待搜索数组的排列数组。

构建系统#

添加了对 AArch64 架构的实验性支持。

C API#

新函数 PyArray_FailUnlessWriteable 提供了一个一致的接口来检查数组的可写性——任何处理数组且其 WRITEABLE 标志先验未知是否为 True 的 C 代码,在写入之前都应确保调用此函数。

NumPy C 样式指南已添加(doc/C_STYLE_GUIDE.rst)。

变更#

通用#

函数 np.concatenate 尝试匹配其输入数组的布局。以前,布局没有遵循任何特定原因,并且以不希望的方式依赖于所选的特定拼接轴。此外,还修复了一个错误,该错误曾默默地允许越界轴参数。

ufuncs logical_orlogical_andlogical_not 现在遵循 Python 对对象数组的行为,而不是尝试调用对象上的方法。例如,表达式 (3 and 'test') 生成字符串 ‘test’,现在 np.logical_and(np.array(3, 'O'), np.array('test', 'O')) 也生成 ‘test’。

ndarrays 上的 .base 属性(用于视图以确保拥有内存的底层数组不会过早释放)现在在存在视图的视图时会折叠引用。例如

a = np.arange(10)
b = a[1:]
c = b[1:]

在 NumPy 1.6 中,c.basebc.base.basea。在 NumPy 1.7 中,c.basea

为了提高依赖旧 .base 行为的软件的向后兼容性,我们只“跳过”与新创建的视图类型完全相同的对象。如果您使用 ndarray 子类,这会产生影响。例如,如果我们有 ndarraymatrix 对象的混合,它们都是同一个原始 ndarray 的视图

a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]

那么 d.base 将是 b。这是因为 d 是一个 matrix 对象,因此折叠过程只会在遇到其他 matrix 对象时继续。它按 cba 的顺序考虑,而 b 是该列表中最后一个是 matrix 对象的条目。

类型转换规则#

由于与 NA 相关的工作,类型转换规则在某些特殊情况下发生了一些变化。特别是对于标量+标量的组合

  • 现在,longlong 类型(q)与任何其他数字(? b h i l q p B H I)进行操作时仍保持为 longlong,而以前它会被转换为 int_l)。ulonglong 类型(Q)现在仍保持为 ulonglong,而不是 uintL)。

  • 现在,timedelta64 类型(m)可以与任何整数类型(b h i l q p B H I L Q P)混合使用,以前会引发 TypeError

对于数组 + 标量,上述规则只是广播,除了数组和标量是无符号/有符号整数的情况,此时结果会转换为数组类型(可能具有更大的大小),如下例所示

>>> (np.zeros((2,), dtype=np.uint8) + np.int16(257)).dtype
dtype('uint16')
>>> (np.zeros((2,), dtype=np.int8) + np.uint16(257)).dtype
dtype('int16')
>>> (np.zeros((2,), dtype=np.int16) + np.uint32(2**17)).dtype
dtype('int32')

大小是否增加取决于标量的大小,例如

>>> (np.zeros((2,), dtype=np.uint8) + np.int16(255)).dtype
dtype('uint8')
>>> (np.zeros((2,), dtype=np.uint8) + np.int16(256)).dtype
dtype('uint16')

此外,complex128 标量 + float32 数组被转换为 complex64

在 NumPy 1.7 中,datetime64 类型(M)必须通过将类型作为第二个参数明确指定来构造(例如 np.datetime64(2000, 'Y'))。

弃用#

通用#

使用 _format 数组属性指定自定义字符串格式化程序已弃用。现在可以使用 numpy.set_printoptionsnumpy.array2string 中的新 formatter 关键字。

多项式包中已弃用的导入已被移除。

如果 axis != 0concatenate 现在对一维数组引发 DeprecationWarning。NumPy 小于 1.7.0 的版本会忽略一维数组的轴参数值。我们目前允许这样做,但适时将引发错误。

C-API#

直接访问 PyArrayObject* 的字段已弃用。许多版本以来一直不建议直接访问。预计未来随着 NumPy 2.0 的准备,PyArray_Descr* 和其他核心对象也将有类似的弃用。

old_defines.h 中的宏已弃用,并将在下一个主要版本(>= 2.0)中移除。可以使用 sed 脚本 tools/replace_old_macros.sed 将这些宏替换为新版本。

您可以通过在包含任何 NumPy 头文件之前添加一行由 #define NPY_NO_DEPRECATED_API 和目标版本号(例如 NPY_1_7_API_VERSION)组成的宏来测试您的代码是否与已弃用的 C API 兼容。

NPY_TYPES 枚举中的 NPY_CHAR 成员已弃用,并将在 NumPy 1.8 中移除。有关更多详细信息,请参阅 gh-2801 上的讨论。