NumPy 1.7.0 Release Notes#
本次发布包含多项新功能,以及大量的错误修复和重构。它支持 Python 2.4 - 2.7 和 3.1 - 3.3,并且是最后一个支持 Python 2.4 - 2.5 的版本。
亮点#
where=参数到 ufuncs(允许使用布尔数组来选择计算应在何处执行)vectorize改进(添加了 ‘excluded’ 和 ‘cache’ 关键字,进行了一般性清理和错误修复)numpy.random.choice(随机样本生成函数)
兼容性说明#
在 NumPy 的未来版本中,函数 np.diag、np.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 的数组)以前会根据所采取的代码路径,不一致地引发 RuntimeError、ValueError 或 TypeError。现在它将一致地引发 ValueError。
The <ufunc>.reduce 函数以与先前 NumPy 版本不同的顺序评估某些缩减,通常提供更高的性能。由于浮点运算的性质,这可能会微妙地改变某些结果,就像将 NumPy 链接到 MKL 等不同的 BLAS 实现一样。
如果从 1.5 升级,那么通常在 1.6 和 1.7 版本中添加了大量代码,并修改了一些代码路径,特别是在类型解析和通用函数上的缓冲迭代方面。这可能会对您的代码产生影响,特别是如果您过去依赖于意外行为。
新功能#
Reduction UFuncs Generalize axis= Parameter#
任何 ufunc.reduce 函数调用,以及 sum、prod、any、all、max 和 min 等其他缩减操作,都支持选择一组要缩减的轴的能力。以前,您可以指定 axis=None 表示所有轴,或 axis=# 选择单个轴。现在,您还可以指定 axis=(#,#) 来选择用于缩减的轴列表。
Reduction UFuncs New keepdims= Parameter#
新增了 keepdims= 参数,如果设置为 True,则不会丢弃缩减轴,而是将其大小设置为一。设置此选项后,缩减结果将正确地广播到被缩减的原始操作数。
Datetime support#
注意
datetime API 在 1.7.0 中是*实验性*的,并且在 NumPy 的未来版本中可能会发生更改。
与 NumPy 1.6 相比,datetime64 进行了大量的修复和增强。
解析器对仅接受 ISO 8601 日期非常严格,并提供了一些便利的扩展。
单位之间的转换正确。
datetime 算术运算正常。
工作日功能(允许 datetime 在仅某些星期几有效的上下文中使用的功能)。
应查阅 doc/source/reference/arrays.datetime.rst 中的说明(也可在在线文档 arrays.datetime.html 中找到)以获取更多详细信息。
Custom formatter for printing arrays#
请参阅 numpy.set_printoptions 函数的新的 formatter 参数。
New function numpy.random.choice#
添加了一个通用的采样函数,用于从给定的类数组结构中生成样本。样本可以是带或不带替换的,以及均匀或给定非均匀概率的。
New function isclose#
返回一个布尔数组,其中两个数组在容差范围内逐元素相等。可以指定相对和绝对容差。
Preliminary multi-dimensional support in the polynomial package#
为积分和微分函数添加了 Axis 关键字,为求值函数添加了 Tensor 关键字。这些新增功能允许在这些函数中使用多维系数数组。添加了用于在网格或点集上求值 2-D 和 3-D 系数数组的新函数,以及可用于拟合的 2-D 和 3-D 伪范德蒙德矩阵。
Ability to pad rank-n arrays#
添加了一个包含 n 维数组填充功能的 pad 模块。各种私有填充函数作为公共“pad”函数的选项公开。示例
pad(a, 5, mode='mean')
Current modes are constant, edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, and <function>.
New argument to searchsorted#
searchsorted 函数现在接受一个“sorter”参数,该参数是一个用于对要搜索的数组进行排序的排列数组。
构建系统#
添加了对 AArch64 架构的实验性支持。
C API#
新增函数 PyArray_FailUnlessWriteable,它提供了检查数组可写性的统一接口——任何处理数组(其 WRITEABLE 标志事先未知为 True)的 C 代码,在写入之前都应确保调用此函数。
添加了 NumPy C Style Guide(doc/C_STYLE_GUIDE.rst)。
更改#
General#
np.concatenate 函数尝试匹配其输入数组的布局。以前,布局没有遵循任何特定原因,并且以不希望的方式依赖于为连接选择的特定轴。还修复了一个允许越界轴参数的错误。
ufuncs logical_or、logical_and 和 logical_not 现在遵循 Python 对对象数组的行为,而不是尝试调用对象上的方法。例如,表达式 (3 and ‘test’) 产生字符串 ‘test’,现在 np.logical_and(np.array(3, ‘O’), np.array(‘test’, ‘O’)) 也产生 ‘test’。
ndarray 的 .base 属性(用于视图以确保拥有内存的底层数组不会过早释放)现在会在您拥有视图的视图时折叠引用。例如
a = np.arange(10)
b = a[1:]
c = b[1:]
In numpy 1.6, c.base is b, and c.base.base is a. In numpy 1.7, c.base is a.
为了提高依赖于 .base 旧行为的软件的向后兼容性,我们仅“跳过”类型与新创建视图完全相同的对象。如果您使用 ndarray 子类,这将产生影响。例如,如果我们有一个 ndarray 和 matrix 对象混合,它们都视图在同一个原始 ndarray 上
a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]
then d.base will be b. This is because d is a matrix object, and so the collapsing process only continues so long as it encounters other matrix objects. It considers c, b, and a in that order, and b is the last entry in that list which is a matrix object.
Casting Rules#
由于 NA 相关的工作,转换规则在边缘情况下发生了一些变化。特别是对于标量+标量的组合
The longlong type (q) now stays longlong for operations with any other number (? b h i l q p B H I), previously it was cast as int_ (l). The ulonglong type (Q) now stays as ulonglong instead of uint (L).
The timedelta64 type (m) can now be mixed with any integer type (b h i l q p B H I L Q P), previously it raised TypeError.
对于 array + scalar,上述规则会进行广播,但当数组和标量是无符号/有符号整数时,结果会被转换为数组类型(可能更大),如下面的示例所示。
>>> (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')
Also a complex128 scalar + float32 array is cast to complex64.
In NumPy 1.7 the datetime64 type (M) must be constructed by explicitly specifying the type as the second argument (e.g. np.datetime64(2000, 'Y')).
弃用#
General#
使用 _format 数组属性指定自定义字符串格式化程序已被弃用。现在可以使用 numpy.set_printoptions 或 numpy.array2string 中的 formatter 关键字。
polynomial 包中已弃用的导入已被移除。
concatenate 现在会为 1D 数组在 axis != 0 时引发 DepractionWarning。NumPy 版本 < 1.7.0 会忽略 1D 数组的 axis 参数值。我们暂时允许这种情况,但最终会引发错误。
C-API#
PyArrayObject* 的字段的直接访问已被弃用。多年来,一直不推荐直接访问。预计未来 PyArray_Descr* 和其他核心对象的类似弃用,为 NumPy 2.0 做准备。
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 处的讨论。