NumPy 1.13.0 发行说明#
此版本支持 Python 2.7 和 3.4 - 3.6.
亮点#
类似
a + b + c的操作将在某些平台上重用临时变量,从而减少内存使用并加快执行速度.原地操作会检查输入是否与输出重叠,并创建临时变量以避免问题.
新的
__array_ufunc__属性为类提供了改进的能力来覆盖默认的ufunc行为.用于创建分块数组的新
np.block函数.
新函数#
新的
np.positiveufunc.新的
np.divmodufunc 提供了更高效的 divmod.新的
np.isnatufunc 测试 NaT 特殊值.新的
np.heavisideufunc 计算 Heaviside 函数.新的
np.isin函数,改进了in1d.用于创建分块数组的新
np.block函数.新的
PyArray_MapIterArrayCopyIfOverlap添加到 NumPy C-API.
详情请见下文.
弃用#
使用
f(x, y=out)调用np.fix,np.isposinf和np.isneginf已弃用 - 该参数应作为f(x, out=out)传递,这与其他类似 ufunc 的接口相匹配.自 1.7 版起已弃用的 C-API
NPY_CHAR类型编号的使用现在会在运行时引发弃用警告. 使用旧版 f2py 版本构建的扩展需要重新编译才能消除警告.当应用于具有 2 个以上维度的数组时,应该使用显式的 axis 参数调用
np.ma.argsort,np.ma.minimum.reduce和np.ma.maximum.reduce,因为此参数的默认值(None)与 numpy 的其余部分(分别为-1,0和0)不一致.np.ma.MaskedArray.mini已弃用,因为它几乎重复了np.MaskedArray.min的功能. 可以使用np.ma.minimum.reduce获得完全等效的行为.np.ma.minimum和np.ma.maximum的单参数形式已被弃用.np.maximum.np.ma.minimum(x)现在应该拼写为np.ma.minimum.reduce(x),这与使用np.minimum完成此操作的方式一致.在非数字 dtype 上调用
ndarray.conjugate已弃用(它应该与np.conjugate的行为相匹配,后者会引发错误).当
axis关键字不满足-a.ndim - 1 <= axis <= a.ndim时调用expand_dims,其中a是正在重塑的数组,已被弃用.
未来的变化#
具有不同字段名称的结构化数组之间的赋值将在 NumPy 1.14 中发生变化. 以前,dst 中的字段将被设置为 src 中同名字段的值. 在 numpy 1.14 中,字段将改为“按位置”分配:dst 的第 n 个字段将被设置为 src 数组的第 n 个字段. 请注意,NumPy 1.12 中引发的
FutureWarning错误地将此更改报告为计划用于 NumPy 1.13 而不是 NumPy 1.14.
构建系统更改#
numpy.distutils现在使用与 GCC 兼容的编译器自动确定 C 文件依赖关系.
兼容性说明#
错误类型变更#
当输入为空时,
numpy.hstack()现在抛出ValueError而不是IndexError.接受 axis 参数的函数,当该参数超出范围时,现在抛出
np.AxisError,而不是IndexError和ValueError的混合. 为了向后兼容性,AxisError是这两个类的子类.
元组对象 dtypes#
已删除对某些无意中允许的晦涩 dtype 的支持,这些 dtype 的形式为 (old_dtype, new_dtype) ,其中任一 dtype 是或包含 object dtype. 作为例外,由于存在现有用例的证据,因此仍然支持 (object, [('name', object)]) 形式的 dtype.
弃用警告变为错误#
参见“变更”部分了解更多详情.
partition, 当使用非整数分区索引时,将引发 TypeError 异常.NpyIter_AdvancedNew, 当oa_ndim == 0且op_axes为 NULL 时,将引发 ValueError 异常.negative(bool_), 对布尔值应用 negative 时,将引发 TypeError 异常.subtract(bool_, bool_), 从布尔值中减去布尔值时,将引发 TypeError 异常.np.equal, np.not_equal, 对象标识不覆盖失败的比较.np.equal, np.not_equal, 对象标识不覆盖非布尔比较.已删除已弃用的布尔索引行为. 参见下面的“变更”了解详情.
已删除已弃用的
np.alterdot()和np.restoredot().
对已更改行为的 FutureWarning#
参见“变更”部分了解更多详情.
numpy.average保留子类array == None和array != None执行逐元素比较.np.equal, np.not_equal, 对象标识不覆盖比较结果.
dtypes 现在始终为 true#
以前, bool(dtype) 会回退到默认的 Python 实现,该实现检查 len(dtype) > 0 是否成立. 由于 dtype 对象将 __len__ 实现为记录字段的数量,因此标量 dtypes 的 bool 将评估为 False ,这不太直观. 现在,对于所有 dtypes, bool(dtype) == True .
__getslice__ 和 __setslice__ 在 ndarray 子类中不再需要#
在 Python 2.7 中对 np.ndarray 进行子类化时,不再_需要_在派生类上实现 __*slice__ ,因为 __*item__ 将正确拦截这些调用.
任何实现了这些功能的代码都将像以前一样工作. 调用 ndarray.__getslice__ 的代码(例如,通过 super(...).__getslice__ ) 现在将发出 DeprecationWarning - 应使用 .__getitem__(slice(start, end)) 代替.
现在使用 ... (省略号)索引 MaskedArrays/Constants 将返回 MaskedArray#
此行为与 np.ndarray 的行为相呼应,并解释了对象 dtype 的 MaskedArrays 中的嵌套数组,以及与其他形式的索引结合使用的省略号.
C API 更改#
空数组上的 GUfuncs 和 NpyIter 轴移除#
现在允许从 NpyIter 中移除零大小的轴. 这可能意味着从 NpyIter 中移除轴的代码在稍后访问移除的维度时必须添加额外的检查.
最大的后续更改是现在允许 gufuncs 具有零大小的内部维度. 这意味着 gufunc 现在必须预料到一个空的内部维度,而这以前是不可能的,并且引发了错误.
对于大多数 gufuncs,没有必要进行更改. 但是,现在对于具有诸如 (..., N, M) -> (..., M) 这样的签名的 gufuncs 来说,如果 N=0 ,则可以返回有效结果,而无需进一步的包装代码.
PyArray_MapIterArrayCopyIfOverlap 已添加到 NumPy C-API#
类似于 PyArray_MapIterArray ,但带有一个附加的 copy_if_overlap 参数. 如果 copy_if_overlap != 0 ,则检查输入是否与其他任何数组具有内存重叠,并进行适当的复制以避免在迭代期间修改输入时出现问题. 有关更完整的文档,请参见文档.
新特性#
添加了 __array_ufunc__#
这是重命名和重新设计的 __numpy_ufunc__ . 任何类(无论是否为 ndarray 子类)都可以定义此方法或将其设置为 None ,以便覆盖 NumPy 的 ufuncs 的行为. 这与 Python 的 __mul__ 和其他二进制运算例程非常相似. 有关此新选项的实现和行为的更详细描述,请参见文档. 该API是临时的,我们尚不保证向后兼容性,因为可能会根据反馈进行修改. 有关更多详细信息,请参见 NEP 13 和 documentation.
新的 positive ufunc#
此ufunc对应于一元 + ,但与ndarray上的 + 不同,如果数组值不支持数值运算,它将引发错误.
新的 divmod ufunc#
此ufunc对应于Python内置的 divmod ,用于在对numpy数组调用时实现 divmod . np.divmod(x, y) 计算的结果等效于 (np.floor_divide(x, y), np.remainder(x, y)) ,但比单独调用这些函数快大约两倍.
np.isnat ufunc 测试 NaT 特殊日期时间和时间差值#
新的 ufunc np.isnat 查找日期时间和时间差数组中特殊 NaT 值的位置.这类似于 np.isnan .
np.heaviside ufunc 计算 Heaviside 函数#
新函数 np.heaviside(x, h0) (一个 ufunc) 计算 Heaviside 函数:
{ 0 if x < 0,
heaviside(x, h0) = { h0 if x == 0,
{ 1 if x > 0.
用于创建分块数组的 np.block 函数#
将新的 block 函数添加到当前堆叠函数 vstack , hstack 和 stack .这允许同时跨多个轴连接,语法类似于数组创建,但元素本身可以是数组.例如:
>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
... [A, np.zeros((2, 3))],
... [np.ones((3, 2)), B ]
... ])
array([[ 2., 0., 0., 0., 0.],
[ 0., 2., 0., 0., 0.],
[ 1., 1., 3., 0., 0.],
[ 1., 1., 0., 3., 0.],
[ 1., 1., 0., 0., 3.]])
虽然主要用于分块矩阵,但这适用于任意维度的数组.
它类似于 Matlab 用于创建分块矩阵的方括号表示法.
isin 函数,改进了 in1d#
新函数 isin 测试 N 维数组的每个元素是否存在于第二个数组中的任何位置.它是 in1d 的增强版本,保留了第一个数组的形状.
临时变量删除#
在提供 backtrace 函数的平台上,NumPy 将尝试避免在涉及基本数字类型的表达式中创建临时变量.例如, d = a + b + c 被转换为 d = a + b; d += c ,这可以提高大型数组的性能,因为执行操作所需的内存带宽更少.
unique 的 axes 参数#
在 N 维数组中,用户现在可以使用 numpy.unique 选择沿哪个轴查找重复的 N-1 维元素.如果 axis=None (默认),则恢复原始行为.
np.gradient 现在支持非均匀间隔的数据#
用户现在可以为数据指定一个非常量的间距.特别是, np.gradient 现在可以采用:
单个标量,用于指定所有维度的样本距离.
N 个标量,用于指定每个维度的恒定样本距离.即
dx,dy,dz,…N 个数组,用于指定沿 F 的每个维度的值的坐标.数组的长度必须与相应维度的大小匹配
N 个标量/数组的任意组合,含义如 2 和 3 所示.
这意味着,例如,现在可以执行以下操作:
>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1. , 1. , -0.5], [ 1. , 1. , -0.5]]),
array([[ 2. , 2. , 2. ], [ 2. , 1.7, 0.5]])]
支持在 apply_along_axis 中返回任意维度的数组#
以前,传递给 apply_along_axis 的函数只能返回标量或 1D 数组.现在,它可以返回任何维度的数组(包括 0D),并且此数组的形状将替换正在迭代的数组的轴.
.ndim 属性已添加到 dtype 以补充 .shape#
为了与 ndarray 和 broadcast 保持一致, d.ndim 是 len(d.shape) 的简写.
在 Python 3.6 中支持 tracemalloc#
NumPy 现在支持使用 Python 3.6 或更新版本中的 tracemalloc 模块进行内存追踪.NumPy 分配的内存将被放置在由 numpy.lib.tracemalloc_domain 定义的域中. 请注意,NumPy 分配将不会在早期 Python 版本的 tracemalloc 中显示.
NumPy 可能会构建带有宽松步长检查调试功能#
当启用宽松步长检查时,在环境中设置 NPY_RELAXED_STRIDES_DEBUG=1 将导致 NumPy 在编译时将受影响的步长设置为 npy_intp 的最大值,以便帮助检测下游项目中步长的无效使用. 启用后,无效使用通常会导致引发错误,但错误的具体类型取决于代码的详细信息. 在实际使用中观察到 TypeError 和 OverflowError.
以前的情况是,此选项在发行版中被禁用,而在主版本中被启用,并且两者之间的更改需要编辑代码. 现在默认情况下已禁用此选项,但可以为测试版本启用.
改进#
Ufunc 对重叠输入的行为#
由于数据依赖性问题,在之前的 NumPy 版本中,ufunc 输入和输出操作数具有内存重叠的操作会产生未定义的结果.在 NumPy 1.13.0 中,此类操作的结果现在定义为与没有内存重叠的等效操作的结果相同.
受影响的操作现在会根据需要创建临时副本,以消除数据依赖性.由于检测这些情况的计算成本很高,因此使用了一种启发式方法,在极少数情况下可能会导致不必要的临时副本.对于数据依赖性足够简单,可以供启发式方法分析的操作,即使数组重叠,如果可以推断出不需要副本,也不会创建临时副本.例如, np.add(a, b, out=a) 不会涉及副本.
为了说明先前未定义的操作:
>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:])
在 NumPy 1.13.0 中,最后一行保证等效于:
>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:])
具有简单的非问题数据依赖性的类似操作是:
>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1])
它将继续产生与以前的 NumPy 版本相同的结果,并且不会涉及不必要的临时副本.
此更改也适用于就地二进制运算,例如:
>>> x = np.random.rand(500, 500)
>>> x += x.T
现在可以保证此语句等效于 x[...] = x + x.T ,而在之前的 NumPy 版本中,结果是未定义的.
使用 MinGW 部分支持 64 位 f2py 扩展#
现在可以使用免费的 MinGW 工具集构建包含 Fortran 库的扩展,也可以在 Python 3.5 下构建.这对于仅进行计算并且适度使用运行时的扩展(例如,从文件中读取和写入)效果最佳. 请注意,这并没有消除对 Mingwpy 的需求;如果您广泛使用运行时,则很可能会遇到问题_.相反,它应该被视为一种临时解决方案,直到 Mingwpy 完全正常运行.
也可以使用来自(可移动)WinPython 3.4 发行版的运行时库,使用 MinGW 工具集编译扩展,这对于具有 PySide1/Qt4 前端的程序可能很有用.
packbits 和 unpackbits 的性能改进#
已优化具有布尔输入的函数 numpy.packbits 和 numpy.unpackbits ,以便对于连续数据而言速度显着提高.
PPC 长双精度浮点信息的修复#
在以前的 NumPy 版本中, finfo 函数返回有关 Power PC(PPC)上 longdouble 浮点类型的 double double 格式的无效信息. 无效值是由于 NumPy 算法未能处理有效位数中可变数量的数字而导致的,这些数字是 PPC long doubles 的一个特征.此版本通过使用启发式方法检测 PPC double double 格式的存在来绕过失败的算法. 使用这些启发式方法的一个副作用是 finfo 函数比以前的版本更快.
ndarray 子类的更好默认 repr#
没有 repr 特化的 ndarray 子类现在可以正确地缩进它们的数据和类型行.
更可靠的掩码数组比较#
对于掩码标量,掩码数组的比较存在错误,并且对于维度高于 1 的结构化数组,比较失败.这两个问题现在都已解决.在此过程中,确保在获得结构化数组的结果时,正确地忽略掩码字段,即,如果所有在两者中都是非掩码的字段都相等,则结果相等,从而使行为与通过比较非结构化掩码数组然后对某些轴执行 .all() 所获得的行为相同.
现在可以使用字符串语法创建具有布尔元素的 np.matrix#
每当尝试将 np.matrix 与布尔值一起使用时,例如 np.matrix('True') , np.matrix 都会失败.现在,这可以按预期工作.
现在更多的 linalg 操作接受空向量和矩阵#
np.linalg 中的以下所有函数现在都可以在给定最后两个维度中具有 0 的输入数组时工作: det , slogdet , pinv , eigvals , eigvalsh , eig , eigh .
捆绑的 LAPACK 版本现在是 3.2.2#
NumPy 捆绑了 lapack 的最小实现,用于没有安装 lapack 库的系统,名称为 lapack_lite . 这已从 LAPACK 3.0.0(1999 年 6 月 30 日)升级到 LAPACK 3.2.2(2010 年 6 月 30 日). 有关所有更改的详细信息,请参阅 LAPACK changelogs .
虽然没有通过 numpy 公开新功能,但这修复了一些关于“工作空间”大小的错误,并且在某些地方可能会使用更快的算法.
更多情况下允许 np.hypot.reduce 和 np.logical_xor 的 reduce#
现在可以在空数组上工作,返回 0,并且可以跨多个轴进行归约. 以前,在这些情况下会抛出 ValueError .
更好的对象数组 repr#
包含自身的Object数组不再导致递归错误.
包含 list 对象的对象数组现在以一种可以清楚区分 2d 对象数组和 1d 对象列表数组的方式打印.
变更#
掩码数组上的 argsort 采用与 sort 相同的默认参数#
默认情况下, argsort 现在将掩码值放在排序数组的末尾,这与 sort 已经做的方式相同. 此外, end_with 参数被添加到 argsort ,以与 sort 保持一致. 请注意,此参数未添加到末尾,因此会破坏任何将 fill_value 作为位置参数传递的代码.
average 现在保留子类#
对于 ndarray 子类, numpy.average 现在将返回子类的实例,这与大多数其他 NumPy 函数(如 mean )的行为相匹配. 因此,返回标量的调用现在也可能返回子类数组标量.
array == None 和 array != None 执行元素级比较#
以前,这些操作分别返回标量 False 和 True .
对象数组的 np.equal, np.not_equal 忽略对象标识#
以前,这些函数总是将相同的对象视为相等. 这具有覆盖比较失败,不返回布尔值的对象的比较(例如 np.arrays)以及结果与对象标识不同的对象(例如 NaN)的比较的效果.
布尔索引变更#
布尔数组类对象(例如 python 布尔列表)始终被视为布尔索引.
布尔标量(包括 Python
True)是合法的布尔索引,并且永远不会被视为整数.布尔索引必须与它们所索引轴的维度相匹配.
在赋值的左侧 (lhs) 使用的布尔索引必须与右侧 (rhs) 的维度相匹配.
布尔索引到标量数组中会返回一个新的 1 维数组.这意味着
array(1)[array(True)]给出array([1])而不是原始数组.
np.random.multivariate_normal 在处理错误的协方差矩阵时的行为#
现在可以通过使用两个新的关键字参数来调整函数在处理协方差矩阵时的行为:
tol可用于指定在检查协方差矩阵是否为正半定矩阵时使用的容差.check_valid可用于配置函数在存在非正半定矩阵时将执行的操作.有效选项为ignore,warn和raise. 默认值warn保留了先前版本中使用的行为.
assert_array_less 现在比较 np.inf 和 -np.inf#
以前, np.testing.assert_array_less 忽略所有无限值. 这与文档和直觉所期望的行为不符. 现在对于任何实数 x,-inf < x < inf 被认为是 True ,所有其他情况都会失败.
assert_array_ 和 masked arrays 的 assert_equal 隐藏更少的警告#
以前被 assert_array_ 函数隐藏的一些警告现在不再隐藏. 在大多数情况下,这些警告应该是正确的,如果发生,将需要更改使用这些函数的测试. 对于 masked array 的 assert_equal 版本,在比较 NaT 时可能会出现警告. 该函数目前不专门处理 NaT 或 NaN,如果由于此更改而出现警告,最好此时避免使用它.
memmap 对象中的 offset 属性值#
memmap 对象中的 offset 属性现在设置为文件中的偏移量.这只是对于大于 mmap.ALLOCATIONGRANULARITY 的偏移量的行为更改.
np.real 和 np.imag 为标量输入返回标量#
以前,当提供标量输入时, np.real 和 np.imag 过去常常返回数组对象,这与 np.angle 和 np.conj 等其他函数不一致.
多项式便利类不能传递给 ufuncs#
ABCPolyBase 类(便利类由此派生)设置 __array_ufun__ = None 以退出 ufuncs. 如果将多项式便利类实例作为参数传递给 ufunc,则现在将引发 TypeError .
ufunc 的输出参数也可以是元组,也适用于 ufunc 方法#
对于 ufunc 的调用,已经可以并且推荐使用带有元组的 out 参数,用于具有多个输出的 ufunc. 现在,这已扩展到 reduce , accumulate 和 reduceat 方法中的输出参数. 这主要是为了与 __array_ufunc 兼容; 目前还没有具有多个输出的 ufunc.