NumPy 1.7.0 发行说明#

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

亮点#

  • ufuncs 的 where= 参数(允许使用布尔数组来选择应在何处进行计算)

  • vectorize 改进(添加了 ‘excluded’ 和 ‘cache’ 关键字,常规清理和错误修复)

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

兼容性说明#

在未来版本的 numpy 中,函数 np.diag,np.diagonal 和 ndarray 的 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,则不会丢弃归约轴,而是将它们设置为大小为 1.设置此选项后,归约结果将正确广播到已归约的原始操作数.

Datetime 支持#

备注

datetime API 在 1.7.0 中是实验性的,并且可能会在未来版本的 NumPy 中进行更改.

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

  • 解析器对于仅接受 ISO 8601 日期非常严格,但有一些方便的扩展

  • 在单位之间正确转换

  • datetime 算术运算正常工作

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

有关更多详细信息,请参阅 doc/source/reference/arrays.datetime.rst 中的注释(也可在在线文档 arrays.datetime.html 中找到).

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

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

新函数 numpy.random.choice#

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

新函数 isclose#

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

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

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

填充 rank-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 尝试匹配其输入数组的布局.以前,布局没有遵循任何特定原因,并且以不希望的方式取决于为串联选择的特定轴.还修复了一个 bug,该 bug 静默地允许超出边界的轴参数.

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.baseb , c.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 对象时才继续.它按顺序考虑 c , ba ,而 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 关键字来代替.

polynomial 包中已弃用的导入已被删除.

如果 axis != 0 , concatenate 现在会为 1D 数组引发 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 中的讨论.