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.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
。
ufunc>.reduce 函数现在以与之前 NumPy 版本不同的顺序评估一些归约操作,通常能提供更高的性能。由于浮点运算的性质,这可能会微妙地改变一些结果,就像将 NumPy 链接到不同的 BLAS 实现(如 MKL)一样。
如果从 1.5 升级,那么在 1.6 和 1.7 中,总体而言添加了大量代码并更改了一些代码路径,尤其是在类型解析和通用函数上的缓冲迭代方面。这可能会对您的代码产生影响,特别是如果您过去依赖于意外行为的话。
新功能#
归约 UFuncs 泛化 axis= 参数#
任何 ufunc.reduce
函数调用,以及 sum
、prod
、any
、all
、max
和 min
等其他归约操作,都支持选择要归约的轴的子集。以前,可以说 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')
当前模式包括 constant
、edge
、linear_ramp
、maximum
、mean
、median
、minimum
、reflect
、symmetric
、wrap
和 <function>
。
searchsorted 的新参数#
函数 searchsorted
现在接受一个 'sorter' 参数,它是一个用于排序待搜索数组的排列数组。
构建系统#
添加了对 AArch64 架构的实验性支持。
C API#
新函数 PyArray_FailUnlessWriteable
提供了一个一致的接口来检查数组的可写性——任何处理数组且其 WRITEABLE 标志先验未知是否为 True 的 C 代码,在写入之前都应确保调用此函数。
NumPy C 样式指南已添加(doc/C_STYLE_GUIDE.rst
)。
变更#
通用#
函数 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’。
ndarrays 上的 .base
属性(用于视图以确保拥有内存的底层数组不会过早释放)现在在存在视图的视图时会折叠引用。例如
a = np.arange(10)
b = a[1:]
c = b[1:]
在 NumPy 1.6 中,c.base
是 b
,c.base.base
是 a
。在 NumPy 1.7 中,c.base
是 a
。
为了提高依赖旧 .base
行为的软件的向后兼容性,我们只“跳过”与新创建的视图类型完全相同的对象。如果您使用 ndarray
子类,这会产生影响。例如,如果我们有 ndarray
和 matrix
对象的混合,它们都是同一个原始 ndarray
的视图
a = np.arange(10)
b = np.asmatrix(a)
c = b[0, 1:]
d = c[0, 1:]
那么 d.base
将是 b
。这是因为 d
是一个 matrix
对象,因此折叠过程只会在遇到其他 matrix
对象时继续。它按 c
、b
和 a
的顺序考虑,而 b
是该列表中最后一个是 matrix
对象的条目。
类型转换规则#
由于与 NA 相关的工作,类型转换规则在某些特殊情况下发生了一些变化。特别是对于标量+标量的组合
现在,longlong 类型(q)与任何其他数字(? b h i l q p B H I)进行操作时仍保持为 longlong,而以前它会被转换为 int_(l)。ulonglong 类型(Q)现在仍保持为 ulonglong,而不是 uint(L)。
现在,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_printoptions
或 numpy.array2string
中的新 formatter
关键字。
多项式包中已弃用的导入已被移除。
如果 axis != 0
,concatenate
现在对一维数组引发 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 上的讨论。