Numpy 1.13.0发行说明

这个版本支持python 2.7和3.4-3.6。

集锦

  • 像这样的操作 a + b + c 将在某些平台上重用临时设备,从而减少内存使用并加快执行速度。

  • 就地操作检查输入是否与输出重叠,并创建临时文件以避免出现问题。

  • 新的 __array_ufunc__ 属性提供了改进的类重写默认UFUNC行为的能力。

  • 新的 np.block 用于创建阻塞数组的函数。

新功能

  • 新的 np.positive UFUNC

  • 新的 np.divmod ufunc提供了更高效的divmod。

  • 新的 np.isnat 对nat特殊值的ufunc测试。

  • 新的 np.heaviside ufunc计算重侧边函数。

  • 新的 np.isin 功能,改进 in1d .

  • 新的 np.block 用于创建阻塞数组的函数。

  • 新的 PyArray_MapIterArrayCopyIfOverlap 添加到numpy c-api。

详情见下文。

贬抑

  • 调用 np.fixnp.isposinfnp.isneginf 具有 f(x, y=out) 已弃用-参数应作为 f(x, out=out) 与其他类似于ufunc的接口匹配。

  • C-API的使用 NPY_CHAR 自1.7版以来已弃用的类型号现在将在运行时引发弃用警告。需要重新编译使用旧的f2py版本构建的扩展以删除警告。

  • np.ma.argsortnp.ma.minimum.reducenp.ma.maximum.reduce 应使用显式调用 axis 参数,当应用于维度超过2的数组时,作为此参数的默认值 (None )与其他 NumPy 人不一致 (-100 ,分别)。

  • np.ma.MaskedArray.mini 不推荐使用,因为它几乎重复了 np.MaskedArray.min . 精确的等效行为可以用 np.ma.minimum.reduce .

  • 单参数形式 np.ma.minimumnp.ma.maximum 被贬低。 np.maximum . np.ma.minimum(x) 现在应该拼写出来了 np.ma.minimum.reduce(x) ,这与如何处理 np.minimum .

  • 调用 ndarray.conjugate 不推荐使用非数字数据类型(它应与 np.conjugate ,这将引发一个错误)。

  • 调用 expand_dimsaxis 关键字不满足 -a.ndim - 1 <= axis <= a.ndim 在哪里 a 数组是否被重新整形,已弃用。

未来变化

  • 具有不同字段名的结构化数组之间的分配将在numpy 1.14中更改。以前,DST中的字段将被设置为SRC中同名字段的值。在numpy 1.14中,字段将改为“按位置”分配:DST的第n个字段将设置为SRC数组的第n个字段。请注意 FutureWarning 在numpy 1.12中引发错误地将此更改报告为numpy 1.13而不是numpy 1.14的计划。

生成系统更改

  • numpy.distutils 现在自动确定与GCC兼容的编译器的C文件依赖性。

兼容性说明

错误类型更改

  • numpy.hstack() 现在投掷 ValueError 而不是 IndexError 当输入为空时。

  • 接受轴参数的函数,当该参数超出范围时,现在引发 np.AxisError 而不是 IndexErrorValueError . 为了向后兼容, AxisError 二者的子类。

元组对象数据类型

已删除对某些不明确的数据类型的支持,这些数据类型是无意中允许的,形式为 (old_dtype, new_dtype) ,其中一个数据类型是或包含 object D型。作为例外,表单的数据类型 (object, [('name', object)]) 由于现有的使用证据,仍然得到支持。

弃用警告错误

有关详细信息,请参阅更改部分。

  • partition ,使用非整数分区索引时出现类型错误。

  • NpyIter_AdvancedNew ,当 oa_ndim == 0op_axes 是空的

  • negative(bool_) ,当对布尔值应用负数时出现类型错误。

  • subtract(bool_, bool_) ,从布尔值中减去布尔值时出现类型错误。

  • np.equal, np.not_equal ,对象标识不重写失败的比较。

  • np.equal, np.not_equal ,对象标识不重写非布尔比较。

  • 已删除不推荐使用的布尔索引行为。有关详细信息,请参阅下面的更改。

  • 已弃用 np.alterdot()np.restoredot() 远离的。

未来走向改变的行为

有关详细信息,请参阅更改部分。

  • numpy.average 保留子类

  • array == Nonearray != None 进行元素比较。

  • np.equal, np.not_equal ,对象标识不重写比较结果。

数据类型现在总是正确的

以前 bool(dtype) 将返回到默认的python实现,该实现检查 len(dtype) > 0 . 自从 dtype 对象实现 __len__ 作为记录字段的数目, bool 标量数据类型的计算结果为 False 这是不可能的。现在 bool(dtype) == True 适用于所有类型。

__getslice____setslice__ 不再需要 ndarray 子类

在python 2.7中对np.ndarray进行子类化时,它不再是 _necessary_ 实施 __*slice__ 在派生类上,如 __*item__ 将正确拦截这些呼叫。

任何实现这些功能的代码都将像以前一样工作。调用“ndarray.”的代码(例如通过 super(...).__getslice__ )现在将发出弃用警告- .__getitem__(slice(start, end)) 应该改为使用。

索引maskedarrays/常量时使用 ... (省略号)现在返回maskedarray

此行为反映np.ndarray的行为,并说明对象数据类型的maskedarrays中的嵌套数组,以及与其他索引形式组合的省略号。

C API更改

空数组上的gufuncs和npyiter轴移除

现在允许从npyier中移除零尺寸的轴。这可能意味着代码从npyiter中删除轴在以后访问删除的维度时必须添加额外的检查。

最大的后续变化是现在允许gufuncs的内部尺寸为零。这意味着一个gufunc现在必须预测一个空的内部维度,而这是不可能的,反而会引发一个错误。

对于大多数古芬克人来说,不需要改变。但是,现在Gufuncs可以使用签名,例如 (..., N, M) -> (..., M) 返回有效结果,如果 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 13documentation 了解更多详细信息。

新的 positive ufunc

此ufunc对应于一元 + 但不同 + 在ndarray上,如果数组值不支持数值操作,则会引发错误。

新的 divmod ufunc

这个ufunc对应于python内置 divmod ,用于实现 divmod 在numpy数组上调用时。 np.divmod(x, y) 计算结果等于 (np.floor_divide(x, y), np.remainder(x, y)) 但是大约是单独调用函数的两倍。

np.isnat 对nat特殊datetime和timedelta值的ufunc测试

新的UFUNC np.isnat 查找datetime和timedelta数组中特殊nat值的位置。这类似于 np.isnan .

np.heaviside ufunc计算重侧函数

新功能 np.heaviside(x, h0) (ufunc)计算重侧函数:

                   { 0   if x < 0,
heaviside(x, h0) = { h0  if x == 0,
                   { 1   if x > 0.

np.block 用于创建阻塞数组的函数

添加新的 block 当前叠加函数的函数 vstackhstackstack . 这允许同时跨多个轴连接,其语法与数组创建类似,但元素本身可以是数组。例如::

>>> 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 function, improving on in1d

新功能 isin 测试N维数组的每个元素是否存在于第二个数组中的任何位置。它是对 in1d 保留第一个数组的形状。

暂时取消

在平台上提供 backtrace 函数numpy将尝试避免在涉及基本数值类型的表达式中创建临时变量。例如 d = a + b + c 转换为 d = a + b; d += c 这可以提高大型阵列的性能,因为执行该操作所需的内存带宽较小。

axes argument for unique

在一个n维数组中,用户现在可以选择沿其查找重复n-1维元素的轴,方法是使用 numpy.unique . 如果 axis=None (默认)。

np.gradient 现在支持不均匀间隔的数据

用户现在可以为数据指定非常量间距。特别地 np.gradient 现在可以采取:

  1. 用于指定所有维度的采样距离的单个标量。

  2. n个标量指定每个维度的恒定采样距离。即 dxdydz ,…

  3. n数组,指定沿f的每个维度的值的坐标。数组的长度必须与相应维度的大小匹配。

  4. 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 . 现在,它可以返回任何维数的数组(包括0d),并且这个数组的形状替换了被迭代的数组的轴。

.ndim property added to dtype to complement .shape

为了与…保持一致 ndarraybroadcastd.ndimlen(d.shape) .

在python 3.6中支持tracemalloc

numpy现在支持内存跟踪 tracemalloc python 3.6或更高版本的模块。来自numpy的内存分配被放入由 numpy.lib.tracemalloc_domain . 请注意,numpy分配不会显示在 tracemalloc 早期的python版本。

numpy可以通过轻松的步调检查调试来构建

在启用“松弛步幅检查”的环境中设置npy_relaxed_steps_debug=1将导致编译numpy,并将受影响的步幅设置为npy_intp的最大值,以帮助检测下游项目中步幅的无效使用。启用时,无效使用通常会导致引发错误,但错误的确切类型取决于代码的详细信息。在野外观察到类型错误和溢出错误。

以前的情况是,此选项在版本中禁用,在主版本中启用,并在两个必需的代码编辑之间进行更改。现在默认情况下它被禁用,但可以为测试生成启用。

改进

重叠输入的UFUNC行为

由于数据依赖性问题,UFUNC输入和输出操作数内存重叠的操作在以前的numpy版本中产生未定义的结果。在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 工具集,也在python 3.5下。这对于只进行计算并适度使用运行时的扩展(例如,从文件读取和写入)最有效。注意,这并不能消除对mingwpy的需求;如果您大量使用运行时,很可能会遇到 issues. 相反,它应该被视为一种创可贴,直到明威完全发挥作用。

扩展也可以使用mingw工具集从(可移动的)winpython 3.4发行版中使用运行库编译,这对于使用pyside1/qt4前端的程序很有用。

性能改进 packbitsunpackbits

功能 numpy.packbits 带布尔输入和 numpy.unpackbits 对连续数据进行了优化,使其速度显著加快。

修复PPC长双浮点信息

在以前版本的numpy中, finfo 函数返回了有关 double double 格式 longdouble 动力PC(PPC)上的浮动式。numpy算法无法处理有效位中的可变位数,这是 PPC long doubles . 这个版本通过使用启发式方法检测PPC双双精度格式的存在来传递失败的算法。使用这些启发式方法的副作用是 finfo 函数比以前的版本快。

更好的默认报告 ndarray 子类

没有的ndarray的子类 repr 专业化现在可以正确地缩进数据和类型行。

屏蔽数组的更可靠比较

蒙面数组的比较对于蒙面标量是错误的,对于维度大于1的结构化数组是失败的。这两个问题现在都解决了。在此过程中,确保在获取结构化数组的结果时,适当忽略屏蔽字段,即,如果两个数组中未屏蔽的所有字段都相等,则结果相等,从而使行为与通过比较非结构化屏蔽数组获得的行为相同,然后执行 .all() 超过某个轴。

现在可以使用字符串语法创建带有布尔值元素的np.matrix

np.matrix 每次尝试使用它时失败,例如, np.matrix('True') . 现在,这是预期的效果。

更多 linalg 操作现在接受空向量和矩阵

中的所有以下功能 np.linalg 现在,当最后两个维度中的输入数组为0时,可以使用: detslogdetpinveigvalseigvalsheigeigh .

现在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 这修复了一些关于“工作区”大小的错误,并且在某些地方可能使用更快的算法。

reduce 属于 np.hypot.reducenp.logical_xor 在更多情况下允许

这现在在空数组上工作,返回0,并且可以在多个轴上减少。以前,A ValueError 在这些箱子里被扔了。

更好 repr 对象数组的

包含自身的对象数组不再导致递归错误。

包含 list 对象的打印方式现在可以清楚地区分二维对象数组和一维对象列表数组。

变化

argsort on masked arrays takes the same default arguments as sort

默认情况下, argsort 现在将屏蔽值放在排序数组的末尾,方法与 sort 已经做到了。另外, end_with 参数添加到 argsort ,以符合 sort . 请注意,此参数不在末尾添加,因此会中断传递的任何代码 fill_value 作为位置参数。

average 现在保留子类

对于ndarray子类, numpy.average 现在将返回子类的实例,匹配大多数其他numpy函数的行为,如 mean . 因此,返回标量的调用现在可能返回子类数组标量。

array == Nonearray != None 进行元素比较

以前这些操作返回scalars FalseTrue 分别。

np.equal, np.not_equal 对于对象数组,忽略对象标识

以前,这些函数总是将相同的对象视为相等的。这会导致覆盖比较失败、比较未返回布尔值的对象(如np.array)以及比较结果与对象标识不同的对象(如nans)。

布尔索引更改

  • 布尔数组(如python bools的列表)始终被视为布尔索引。

  • 布尔标量(包括python True )是合法的布尔索引,从未被视为整数。

  • 布尔索引必须与其索引的轴的维度匹配。

  • 在赋值的lhs上使用的布尔索引必须与rhs的维度匹配。

  • 布尔索引到标量数组返回一个新的一维数组。这意味着 array(1)[array(True)] 给予 array([1]) 而不是原始数组。

np.random.multivariate_normal 协方差矩阵差的行为

现在可以通过使用两个新的关键字参数来调整函数在处理协方差矩阵时的行为:

  • tol 可用于指定检查协方差矩阵是否为半正定时要使用的公差。

  • check_valid 可用于配置函数在存在非正半定矩阵时的作用。有效选项包括 ignorewarnraise . 默认值, warn 保留以前版本上使用的行为。

assert_array_less 比较 np.inf-np.inf 现在

以前, np.testing.assert_array_less 忽略所有无限值。根据文档和直觉,这不是预期的行为。现在考虑-inf<x<inf True 对于任何实数x和所有其他情况都失败。

assert_array_ 和屏蔽数组 assert_equal 隐藏较少的警告

以前被 assert_array_ 函数不再隐藏。在大多数情况下,警告应该是正确的,如果出现警告,则需要使用这些功能更改测试。对于屏蔽数组 assert_equal 版本,比较nat时可能出现警告。该函数目前不专门处理NaT或NaN,如果由于此更改而出现警告,此时最好避免使用它。

offset 属性值在 memmap 物体

这个 offset 属性中的 memmap 对象现在设置为文件中的偏移量。这只是对大于 mmap.ALLOCATIONGRANULARITY .

np.realnp.imag 返回标量输入的标量

以前, np.realnp.imag 用于在提供标量输入时返回数组对象,该输入与其他函数不一致,如 np.anglenp.conj .

多项式便利类不能传递给ufuncs

从中派生便利类的abcpolybase类集合 __array_ufun__ = None 为了选择退出UFUNC。如果多项式便利类实例作为参数传递给ufunc,则 TypeError 现在将被提升。

ufuncs的输出参数可以是元组,也可以是ufunc方法的元组

对于对UFUNC的呼叫,已经可以并建议使用 out 具有多个输出的UFUNC的元组参数。现在已扩展到 reduceaccumulatereduceat 方法。这主要是为了与 __array_ufunc ;目前还没有具有多个输出的UFunc。