NumPy 1.7.0 版本说明#
此版本包含一些新功能以及许多错误修复和重构。它支持 Python 2.4 - 2.7 和 3.1 - 3.3,也是最后一个支持 Python 2.4 - 2.5 的版本。
亮点#
where=
参数添加到 ufunc(允许使用布尔数组选择应执行计算的位置)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,则不会丢弃约简轴,而是将其大小设置为 1。当设置此选项时,约简结果将正确广播到被约简的原始操作数。
日期时间支持#
注意
日期时间 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 尝试匹配其输入数组的布局。以前,布局没有遵循任何特定原因,并且以不希望的方式依赖于为连接选择的特定轴。还修复了一个错误,该错误会静默地允许超出范围的轴参数。
ufunc 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
关键字来替代。
多项式包中已弃用的导入已被移除。
concatenate
现在对于一维数组,如果 axis != 0
,则会引发 DepractionWarning。NumPy < 1.7.0 的版本会忽略一维数组的 axis 参数值。我们目前允许这样做,但最终会引发错误。
C-API#
直接访问 PyArrayObject* 的字段已被弃用。在许多版本中,都不建议直接访问。将来,对于 PyArray_Descr* 和其他核心对象,也会出现类似的弃用,作为 NumPy 2.0 的准备工作。
old_defines.h 中的宏已被弃用,并将在下个主要版本(>= 2.0)中移除。可以使用 sed 脚本 tools/replace_old_macros.sed 将这些宏替换为较新的版本。
可以通过添加一行由 #define NPY_NO_DEPRECATED_API
和目标版本号(例如 NPY_1_7_API_VERSION
)组成的代码,在包含任何 NumPy 头文件之前来测试代码对已弃用 C API 的兼容性。
NPY_CHAR
NPY_TYPES
枚举的成员已被弃用,并将从 NumPy 1.8 中移除。有关更多详细信息,请参阅 gh-2801 中的讨论。