Numpy 1.9.0发行说明

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

集锦

  • 各个领域的性能改进很多,最显著的是索引和小阵列上的操作速度明显更快。索引操作现在也释放了gil。

  • 添加 nanmediannanpercentile 舍入NanFunction集。

下降支座

  • 已删除OldNumeric和NumArray模块。

  • 已删除doc/pyrex和doc/cython目录。

  • 已删除doc/numpybook目录。

  • numpy/testing/numpytest.py文件已与其包含的importall函数一起删除。

未来变化

  • numpy/polynomy/polytemplate.py文件将在numpy 1.10.0中删除。

  • 在numpy 1.10.0中,inplace操作的默认强制转换将更改为“同类”。这肯定会破坏一些当前忽略警告的代码。

  • 放松步幅检查将是1.10.0中的默认设置。

  • 字符串版本检查将中断,因为“1.9”、“1.10”为真。已添加可用于此类比较的NumpyVersion类。

  • 对角线和diag函数将返回1.10.0中的可写视图。

  • 这个 S 和/或 a DTypes可以更改为表示python字符串而不是字节,在python 3中,这两种类型非常不同。

兼容性说明

对角线和diag函数返回只读视图。

在numpy 1.8中,对角线和diag函数返回只读副本,在numpy 1.9中返回只读视图,在1.10中返回可写视图。

特殊的标量浮点值不会再导致upcast加倍

在以前的numpy版本中,涉及包含特殊值的浮点标量的操作 NaNInf-Inf 导致结果类型至少为 float64 . 由于特殊值可以用最小的可用浮点类型表示,因此不会再执行上溯。

例如,数据类型:

np.array([1.], dtype=np.float32) * float('nan')

现在仍然 float32 而不是被强制 float64 . 未更改涉及非特殊值的操作。

百分位数输出变化

如果给定多个百分位数来计算numpy.percentile,则返回数组而不是列表。一个百分点值仍然返回一个标量。数组相当于将旧版本中返回的列表通过 np.array .

如果 overwrite_input 选项被使用输入只是部分而不是完全排序。

ndarray.tofile异常类型

所有 tofile 现在有例外 IOError ,有些是以前的 ValueError .

填充值异常无效

对numpy.ma.core.进行两次更改。检查填充值:

  • 当填充值为字符串且数组类型不是“osuv”时,将引发typeerror,而不是使用默认填充值。

  • 当填充值溢出数组类型时,将引发类型错误而不是溢出错误。

多项式类不再从多基派生

这可能会导致依赖多项式类从多基派生的人出现问题。它们现在都是从抽象基类abcpolybase派生的。严格地说,应该涉及到一个贬义,但没有找到使用旧基类的外部代码。

使用numpy.random.binomial可能会改变RNG状态,而numpy<1.9

一种生成二项式随机变量的算法中的一个错误已经被修复。此更改可能会更改执行的随机绘制的数量,因此在调用distribution.c::rk_二项式u btpe后,序列位置将不同。任何依赖RNG处于已知状态的测试都应进行检查和/或更新。

随机种子强制为32位无符号整数

np.random.seednp.random.RandomState 现在扔一个 ValueError 如果种子不能安全地转换为32位无符号整数。现在失败的应用程序可以通过将较高的32位值屏蔽为零来修复: seed = seed & 0xFFFFFFFF . 这是在旧版本中静默执行的操作,因此随机流保持不变。

argmin和argmax out参数

这个 out 参数 np.argminnp.argmax 现在检查它们的等效C-API函数,以精确匹配所需的输出形状。如果支票不通过 ValueError 而不是 TypeError 提高了。

爱因姆

删除不必要的广播符号限制。 np.einsum('ijk,j->ijk', A, B) 也可以写为 np.einsum('ij...,j->ij...', A, B) (在“j”上不再需要省略号)

索引

numpy索引在此版本中已完全重写。这使得最高级的整数索引操作更快,应该没有其他影响。但是,高级索引操作中引入了一些细微的更改和取消预测:

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

  • 对一维数组的高级索引,过去在值数组的形状太小或不匹配时,对于在赋值中重复值数组有(未记录)特殊处理。使用此代码将引发错误。为了兼容性,您可以使用 arr.flat[index] = values ,它使用旧的代码分支。(例如 a = np.ones(10); a[np.arange(10)] = [1, 2, 3]

  • 以前高级索引的迭代顺序总是C顺序。在1.9号。迭代顺序适应输入,不保证(除了 单一的 高级索引,由于兼容性的原因永远不会反转)。这意味着如果将多个值赋给同一个元素,则结果是未定义的。例如: arr[[0, 0], [1, 1]] = [1, 2] 可以设置 arr[0, 1] 到1或2。

  • 与迭代顺序相同,高级索引结果的内存布局适合于更快的索引,并且无法预测。

  • 所有索引操作都返回一个视图或副本。没有索引操作将返回原始数组对象。(例如 arr[...]

  • 在将来,布尔数组(如python bools的列表)将始终被视为布尔索引和布尔标量(包括python True )将是一个合法的 布尔 索引。此时,对于标量数组来说,这已经是允许 positive = a[a > 0] 工作时 a 是零维的。

  • 在numpy 1.8中,可以使用 array(True)array(False) 如果操作结果是标量,则等于1和0。这将在numpy 1.9中引发一个错误,如上所述,在将来将其视为布尔索引。

  • 所有非整数数组类型都已弃用,自定义整数类对象的对象数组可能必须显式强制转换。

  • 高级索引的错误报告信息更丰富,但在某些情况下错误类型已更改。(索引数组的广播错误报告为 IndexError

  • 使用多个省略号进行索引 (... )已弃用。

不推荐使用非整数缩减轴索引

非整数轴索引,用于减少类UFUNC add.reducesum 被贬低。

promote_types 和字符串数据类型

promote_types 函数现在返回一个有效的字符串长度,条件是将整数或浮点数据类型作为一个参数,将字符串数据类型作为另一个参数。以前,它总是返回输入字符串dtype,即使其长度不足以存储转换为字符串的max integer/float值。

can_cast 和字符串数据类型

can_cast 如果字符串数据类型长度不足以存储转换为字符串的最大整数/浮点值,那么函数现在在整数/浮点数据类型和字符串数据类型的“安全”转换模式下返回false。以前 can_cast 在“safe”模式下,对于integer/float数据类型和任意长度的string数据类型返回true。

A类型和字符串数据类型

这个 astype 如果要强制转换到的字符串数据类型在“安全”强制转换模式下的长度不足以容纳正在强制转换的整数/浮点数组的最大值,则方法现在返回一个错误。以前,即使结果被截断,也允许强制转换。

npyio.recfromcsv 关键字参数更改

npyio.recfromcsv 不再接受无证件 update 关键字,用于重写 dtype 关键字。

这个 doc/swig 目录移动

这个 doc/swig 目录已移动到 tools/swig .

这个 npy_3kcompat.h 报头改变

未使用的 simple_capsule_dtor 函数已从中删除 npy_3kcompat.h . 请注意,此头并不打算在numpy之外使用;其他项目在需要时应该使用自己的文件副本。

C-API中的负指数 sq_itemsq_ass_item 顺序法

当直接访问 sq_itemsq_ass_item PyObject槽用于项目获取,负索引将不再受支持。 PySequence_GetItemPySequence_SetItem 但是,固定负指数,以便它们可以在那里使用。

NDIter

什么时候? NpyIter_RemoveAxis 现在调用,迭代器范围将被重置。

当跟踪多索引而不缓冲迭代器时,可以使用 NpyIter_RemoveAxis . 在这种情况下,迭代器可以缩小大小。因为迭代器的总大小是有限的,所以迭代器在调用之前可能太大。在这种情况下,它的大小将设置为 -1 以及在构造时,但在删除多索引、设置迭代器范围或获取下一个函数时发出的错误。

这对当前工作的代码没有影响,但强调了在可能发生这些情况时检查错误返回的必要性。在大多数情况下,被迭代的数组和迭代器一样大,这样就不会发生这样的问题。

此更改已应用于1.8.1版本。

zeros_like 对于字符串,DTypes现在返回空字符串

匹配 zeros 功能 zeros_like 现在返回用空字符串初始化的数组,而不是用 '0' .

新特点

Percentile支持更多的插值选项

np.percentile 现在有了interpolation关键字参数来指定如果百分位数介于两个值之间,应该以何种方式对点进行插值。有关可用选项,请参阅文档。

中位数和百分位数的广义轴支持

np.mediannp.percentile 现在支持通用轴参数,比如1.7以后的ufunc约简。现在可以说axis=(index,index)来选择要进行缩减的轴列表。这个 keepdims 还添加了关键字参数以方便广播到原始形状的数组。

添加到的dtype参数 np.linspacenp.logspace

返回的数据类型 linspacelogspace 现在可以使用dtype参数指定函数。

更一般 np.triunp.tril 广播

用于数组 ndim 超过2,这些函数现在将应用于最后两个轴,而不是引发异常。

tobytes 别名 tostring 方法

ndarray.tobytesMaskedArray.tobytes 已添加为的别名 tostring 将数组导出为 bytes . 这在Python3中更为一致,其中 strbytes 不一样。

构建系统

增加了对PPC64LE和OpenRISC体系结构的实验支持。

与python的兼容性 numbers 模块

所有数字numpy类型现在都注册到python中的类型层次结构中。 numbers 模块。

increasing parameter added to np.vander

vandermonde矩阵的列的顺序可以用这个新的布尔参数指定。

unique_counts parameter added to np.unique

现在可以作为可选返回值获得输入中每个唯一项出现的次数。

支持NanFunctions中的中位数和百分位数

这个 np.nanmediannp.nanpercentile 函数的行为类似于中位数和百分位数函数,除了NaN被忽略。

已添加NumpyVersion类

该类可以从numpy.lib导入,并在numpy版本变为1.10.devel时用于版本比较。例如::

>>> from numpy.lib import NumpyVersion
>>> if NumpyVersion(np.__version__) < '1.10.0'):
...     print('Wow, that is an old NumPy version!')

允许保存具有大量命名列的数组

numpy存储格式1.0只允许数组头的总大小为65535字节。具有大量列的结构化数组可能会超过此值。添加了一种新的格式2.0,将头段大小扩展到4 Gib。 np.save 如果数据需要,将自动以2.0格式保存,否则将始终使用更兼容的1.0格式。

全面的广播支持 np.cross

np.cross 现在正确地广播它的两个输入数组,即使它们有不同的维数。在早期版本中,这将导致引发错误或计算错误的结果。

改进

在某些情况下求和的数值稳定性更好

现在求和方法中使用了成对求和,但仅沿快速轴和长度不等于8192的值组使用。在某些常见情况下,这还应提高VaR和Std的准确性。

实施百分比 np.partition

np.percentile 已在以下方面实施 np.partition 它只通过选择算法对数据进行部分排序。这提高了时间复杂性 O(nlog(n))O(n) .

性能改进 np.array

将包含数组的列表转换为使用 np.array 已经改进了。它现在的速度相当于 np.vstack(list) .

性能改进 np.searchsorted

对于内置的数字类型, np.searchsorted 不再依赖数据类型 compare 函数执行搜索,但现在由类型特定的函数实现。根据输入的大小,这可能导致性能提高2倍以上。

NP.distutils的可选降低详细度

集合 numpy.distutils.system_info.system_info.verbosity = 0 然后打电话给 numpy.distutils.system_info.get_info('blas_opt') 不会在输出上打印任何内容。这主要适用于使用numpy.distutils的其他包。

协方差签入 np.random.multivariate_normal

A RuntimeWarning 当协方差矩阵不是半正定的时候会发出警告。

多项式类不再基于模板

为了实现公共接口,多项式类被重构为使用抽象基类而不是模板。这使得导入多项式包更快,因为导入时不需要编译类。

更多GIL发布

现在还有几个函数释放了全局解释器锁,允许使用 threading 模块。最值得注意的是,英国国债现在以花哨的指数方式发行, np.where 以及 random 模块现在使用每状态锁而不是gil。

对更复杂的基类的maskedarray支持

将删除基本类行为类似于普通数组的内置假设。在粒子中, reprstr 现在应该更可靠地工作了。

C-API

贬抑

序列重复的非整数标量

不推荐使用非整数numpy scalars来重复python序列。例如 np.float_(2) * [1] 将来会是一个错误。

select 输入折旧

整数和空输入 select 被贬低。在将来,只有布尔数组才是有效的条件,并且 condlist 将被视为输入错误而不是返回默认值。

rank 功能

这个 rank 函数已被弃用,以避免与 numpy.linalg.matrix_rank .

对象数组相等性比较

在未来的对象数组比较中 ==np.equal 不再使用身份检查。例如:

>>> a = np.array([np.array([1, 2, 3]), 1])
>>> b = np.array([np.array([1, 2, 3]), 1])
>>> a == b

即使数组位于 ab 是同一个对象。

相等运算符 == 将来会引起错误,比如 np.equal 如果广播或元素比较等失败。

比较 arr == None 将来将进行元素比较,而不是返回false。代码应该使用 arr is None .

所有这些变化都会在这个时候带来不可预测或未来的警告。

C-API

实用程序函数npy-pyfile-dup和npy-pyfile-dupclose被内部缓冲python 3应用于其文件对象而中断。要修复这两个新函数npy_pyfile_dup2和npy_pyfile_dupclose2在npy_3kcompat.h中声明,旧函数已弃用。由于这些函数的脆弱性,建议尽可能使用python API。

此更改已应用于1.8.1版本。