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 的对角线方法将返回原始数组的视图,而不是像现在这样生成一个副本.如果你写入这些函数返回的数组,这将有所不同.为了便于这种过渡,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中通常已经添加了大量代码,并且某些代码路径有所更改,特别是在类型解析和通用函数的缓冲迭代领域.这可能会对您的代码产生影响,特别是如果您过去依赖于意外行为.

新功能#

Reduction UFuncs 泛化 axis= 参数#

任何 ufunc.reduce 函数调用,以及其他减少操作如 sum、prod、any、all、max 和 min 都支持选择一个轴的子集来进行减少.以前,可以说 axis=None 来表示所有轴,或者 axis=# 来选择单个轴.现在,也可以说 axis=(#,#) 来选择一个轴列表进行减少.

Reduction UFuncs 新增 keepdims= 参数#

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

日期时间支持#

备注

datetime API 在 1.7.0 版本中是 实验性 的,并且在 NumPy 的未来版本中可能会经历变化.

与NumPy 1.6相比,datetime64 有许多修复和增强:

  • 解析器对只接受 ISO 8601 日期非常严格,并提供了一些便利的扩展.

  • 正确地在单位之间转换

  • datetime 算术运算正确

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

doc/source/reference/arrays.datetime.rst 中的注释(也可以在 arrays.datetime.html 的在线文档中查看)应参考以获取更多详细信息.

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

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

新函数 numpy.random.choice#

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

新函数 isclose#

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

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

轴关键字已添加到积分和微分函数中,并且张量关键字已添加到评估函数中.这些添加允许在那些函数中使用多维系数数组.添加了用于在网格或点集上评估2-D和3-D系数数组的新函数,以及可用于拟合的2-D和3-D伪Vandermonde矩阵.

能够填充秩为n的数组#

一个包含用于填充n维数组函数的pad模块已添加.各种私有填充函数作为选项暴露给一个公共的’pad’函数.示例:

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

当前模式包括 constantedgelinear_rampmaximummeanmedianminimumreflectsymmetricwrap<function>.

searchsorted 的新参数#

函数 searchsorted 现在接受一个 ‘sorter’ 参数,该参数是一个排列数组,用于对要搜索的数组进行排序.

构建系统#

增加了对 AArch64 架构的实验性支持.

C API#

新函数 PyArray_FailUnlessWriteable 提供了一个一致的接口来检查数组的可写性——任何与数组一起工作的C代码,其WRITEABLE标志事先不知道为True,在写入之前应确保调用此函数.

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.basea.在 numpy 1.7 中,``c.base`` 是 a.

为了提高依赖于 .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 而不是 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_printoptionsnumpy.array2string 中的新 formatter 关键字代替.

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

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_CHAR 枚举成员 NPY_TYPES 已被弃用,并将在 NumPy 1.8 中移除.更多详细信息请参见 gh-2801 的讨论.