Skip to content

Latest commit

 

History

History
843 lines (434 loc) · 43.2 KB

np126_1183.md

File metadata and controls

843 lines (434 loc) · 43.2 KB

NumPy 1.9.0 发布说明

原文:numpy.org/doc/1.26/release/1.9.0-notes.html

该版本支持 Python 2.6 - 2.7 和 3.2 - 3.4。

亮点

  • 在各个领域进行了许多性能改进,尤其是对小数组的索引和操作明显更快。现在索引操作也会释放 GIL。

  • 添加了nanmediannanpercentile,完善了 nanfunction 集。

不再支持

  • 旧的 numeric 和 numarray 模块已被移除。

  • doc/pyrex 和 doc/cython 目录已被移除。

  • doc/numpybook 目录已被移除。

  • numpy/testing/numpytest.py 文件已被移除,以及其中包含的 importall 函数。

未来变化

  • numpy/polynomial/polytemplate.py 文件将在 NumPy 1.10.0 中被移除。

  • 默认情况下,就地操作的强制转换将在 Numpy 1.10.0 中更改为‘same_kind’。这肯定会破坏一些当前忽略警告的代码。

  • 在 1.10.0 中,宽松的步幅检查将成为默认设置

  • 字符串版本检查将中断,例如,‘1.9’ > ‘1.10’为 True。已添加了一个 NumpyVersion 类,可用于此类比较。

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

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

兼容性说明

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

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

特殊标量浮点值不再导致向上转换为双精度

在以前的 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._check_fill_value 进行了两个更改:

  • 当填充值为字符串且数组类型不是‘OSUV’之一时,会引发 TypeError 而不是使用默认填充值。

  • 当填充值溢出数组类型时,会引发 TypeError 而不是 OverflowError。

多项式类不再从 PolyBase 派生

这可能会导致依赖于多项式类从 PolyBase 派生的人遇到问题。它们现在都是从抽象基类 ABCPolyBase 派生的。严格来说,应该涉及到弃用,但没有找到使用旧基类的外部代码。

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

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

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

如果 np.random.seednp.random.RandomState 的种子不能安全地转换为 32 位无符号整数,则现在会抛出 ValueError。现在失败的应用程序可以通过将高 32 位值掩码为零来修复:seed = seed & 0xFFFFFFFF。这在旧版本中是默默地完成的,因此随机流保持不变。

Argmin 和 argmax 的 out 参数

np.argminnp.argmax 及其等效的 C-API 函数的 out 参数现在被检查以确保精确匹配所需的输出形状。如果检查失败,则会引发 ValueError 而不是 TypeError

Einsum

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

索引

NumPy 索引在这个版本中进行了完全重写。这使得大多数高级整数索引操作更快,并且不应该有其他影响。然而,在高级索引操作中引入了一些微妙的变化和弃用:

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

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

  • 高级索引的迭代顺序过去总是 C 顺序。在 NumPy 1.9 中,迭代顺序会根据输入进行调整,并且不保证(除了一个单一的高级索引,出于兼容性原因永远不会被反转)。这意味着如果向同一元素分配多个值,则结果是未定义的。一个例子是 arr[[0, 0], [1, 1]] = [1, 2],这可能将 arr[0, 1] 设置为 1 或 2。

  • 与迭代顺序等效,高级索引结果的内存布局已调整以实现更快的索引,并且无法预测。

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

  • 将来,布尔数组样式(例如 python bools 列表)将始终被视为布尔索引,布尔标量(包括 python True)将成为合法的boolean索引。此时,对于标量数组,已经允许一般的positive = a[a > 0]a为零维时起作用。

  • 在 NumPy 1.8 中,如果操作的结果是标量,可以使用array(True)array(False)分别等同于 1 和 0。在 NumPy 1.9 中将引发错误,并且如上所述,在将来将被视为布尔索引。

  • 所有非整数数组样式都已被弃用,自定义整数对象的对象数组可能需要显式转换。

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

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

非整数缩减轴索引已被弃用

对于像add.reducesum这样的缩减 ufuncs,非整数轴索引已被弃用。

promote_types和字符串 dtype

当一个参数为整数或浮点 dtype,另一个参数为字符串 dtype 时,promote_types函数现在返回有效的字符串长度。以前,即使输入的字符串 dtype 长度不足以存储转换为字符串的最大整数/浮点值,它总是返回输入的字符串 dtype。

can_cast和字符串 dtype

如果字符串 dtype 的长度不足以存储转换为字符串的最大整数/浮点值,则can_cast函数现在在“安全”转换模式下返回 False,对于整数/浮点 dtype 和字符串 dtype。以前,在“安全”模式下,can_cast对于整数/浮点 dtype 和任何长度的字符串 dtype 返回 True。

astype 和字符串 dtype

如果要转换为的字符串 dtype 在“安全”转换模式下不足以容纳正在转换的整数/浮点数组的最大值,则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 版本。

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

为了匹配zeros函数,zeros_like现在返回一个用空字符串初始化的数组,而不是一个填充了*‘0’*的数组。

新特性

百分位数支持更多的插值选项

np.percentile现在具有插值关键字参数,用于指定百分位数落在两个值之间时应如何插值。请查看文档以获取可用选项。

中位数和百分位数的通用轴支持

自 1.7 版本以来,np.mediannp.percentile现在支持类似 ufunc reductions 的通用轴参数。现在可以使用 axis=(index, index)来选择要减少的轴列表。还添加了keepdims关键字参数,以便将广播到原始形状的数组。

np.linspacenp.logspace中添加了 dtype 参数

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

更通用的np.triunp.tril广播

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

tobytes方法的别名为tostring

ndarray.tobytesMaskedArray.tobytes已添加为tostring的别名,用于将数组导出为bytes。这在 Python 3 中更一致,因为strbytes不相同。

构建系统

添加了对 ppc64le 和 OpenRISC 架构的实验性支持。

与 python numbers模块的兼容性

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

np.vander中添加了increasing参数

可以使用这个新的布尔参数指定范德蒙矩阵的列的顺序。

np.unique中添加了unique_counts参数

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

nanfunctions 中支持中位数和百分位数。

np.nanmediannp.nanpercentile函数的行为类似于中位数和百分位数函数,只是会忽略 NaN 值。

添加了 NumpyVersion 类。

当 numpy 版本升级到 1.10.devel 时,可以从 numpy.lib 中导入该类,并用于版本比较。例如:

>>> 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现在正确地广播其两个输入数组,即使它们具有不同的维度数量。在早期版本中,这可能会导致引发错误或计算错误的结果。

改进

在某些情况下,对 sum 的数值稳定性进行了改进。

sum 方法现在使用成对求和,但仅沿着快速轴,并且对长度<=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中进行协方差检查。

当协方差矩阵不是半正定时,会引发RuntimeWarning警告。

多项式类不再基于模板。

多项式类已经重构为使用抽象基类而不是模板,以实现一个共同的接口。这使得导入多项式包更快,��为在导入时不需要编译类。

更多的 GIL 释放。

几个更多的函数现在释放全局解释器锁,允许使用 threading 模块更有效地并行化。特别是 GIL 现在会在 fancy indexing、np.whererandom 模块中释放,现在使用每个状态锁而不是 GIL。

MaskedArray 对更复杂的基类的支持

内置的假设基类的行为类似于普通数组的假设正在被移除。特别是,reprstr 现在应该更可靠地工作。

C-API

弃用

非整数标量用于序列重复

使用非整数 numpy 标量重复 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 中是相同对象,也将始终返回 False(并在将来出错)。

等号运算符 == 将来会像 np.equal 一样引发错误,如果广播或元素比较等失败。

arr == None 的比较将来会进行逐元素比较,而不仅仅返回 False。代码应该使用 arr is None

所有这些更改现在都会在此时给出 Deprecation- 或 FutureWarnings。

C-API

实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose 被内部缓冲 python 3 应用于其文件对象所破坏。为了解决这个问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并弃用了旧函数。由于这些函数的脆弱性,建议尽可能使用 python API。

此更改已应用于 1.8.1 版本。

亮点

  • 在各个领域进行了许多性能改进,尤其是对小数组的索引和操作明显更快。现在索引操作也会释放 GIL。

  • nanmediannanpercentile 的添加完善了 nanfunction 集合。

已停止支持

  • oldnumeric 和 numarray 模块已被移除。

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

  • doc/numpybook 目录已被删除。

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

未来的更改

  • numpy/polynomial/polytemplate.py 文件将在 NumPy 1.10.0 中被移除。

  • 默认的就地操作类型转换将在 Numpy 1.10.0 中更改为 ‘same_kind’。这肯定会破坏一些当前忽略警告的代码。

  • 在 1.10.0 中,宽松的步幅检查将成为默认设置。

  • 字符串版本检查会出现问题,例如,‘1.9’ > ‘1.10’ 为 True。已添加了一个 NumpyVersion 类,可用于此类比较。

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

  • S 和/或 a 数据类型可能会更改以表示 Python 字符串而不是字节,在 Python 3 中,这两种类型非常不同。

兼容性说明

对角线和 diag 函数返回可写视图。

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

特殊标量浮点值不再导致向上转换为双精度

在以前的 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._check_fill_value 进行了两个更改:

  • 当填充值为字符串且数组类型不是 ‘OSUV’ 之一时,会引发 TypeError 而不是使用默认填充值。

  • 当填充值溢出数组类型时,会引发 TypeError 而不是 OverflowError。

多项式类不再从 PolyBase 派生

这可能会导致依赖于多项式类从 PolyBase 派生的人遇到问题。它们现在都是从抽象基类 ABCPolyBase 派生的。严格来说,应该涉及弃用,但找不到使用旧基类的外部代码。

使用 numpy.random.binomial 可能会改变 RNG 状态与 numpy < 1.9 的情况。

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

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

np.random.seednp.random.RandomState 现在如果种子不能安全地转换为 32 位无符号整数将抛出 ValueError。现在失败的应用程序可以通过将高 32 位值掩码为零来修复:seed = seed & 0xFFFFFFFF。这在旧版本中是默默地完成的,以便随机流保持不变。

Argminargmax 输出参数

np.argminnp.argmax 及其等效的 C-API 函数的 out 参数现在会被检查以确保与期望的输出形状完全匹配。如果检查失败,将引发 ValueError 而不是 TypeError

Einsum

删除不必要的广播符号限制。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 顺序。在 NumPy 1.9 中,迭代顺序会根据输入进行调整,并且不保证(除了一个单一的高级索引,出于兼容性原因永远不会被反转)。这意味着如果将多个值分配给同一个元素,则结果是未定义的。一个例子是 arr[[0, 0], [1, 1]] = [1, 2],这可能将 arr[0, 1] 设置为 1 或 2。

  • 与迭代顺序类似,高级索引结果的内存布局会根据更快的索引进行调整,无法预测。

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

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

  • 在 NumPy 1.8 中,如果操作的结果是标量,可以使用 array(True)array(False) 相当于 1 和 0。这在 NumPy 1.9 中将引发错误,并且如上所述,将来会被视为布尔索引。

  • 所有非整数数组都已被弃用,自定义整数对象的对象数组可能需要显式转换。

  • 高级索引的错误报告更加详细,但在某些情况下错误类型已经发生了变化。(广播索引数组的错误报告为IndexError

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

非整数缩减轴索引已被弃用

非整数轴索引到缩减 ufuncs(如add.reducesum)已被弃用。

promote_types和字符串 dtype

promote_types函数现在在给定整数或浮点 dtype 作为一个参数和字符串 dtype 作为另一个参数时返回有效的字符串长度。以前,即使输入的字符串 dtype 长度不足以存储转换为字符串的最大整数/浮点值,它也总是返回输入的字符串 dtype。

can_cast和字符串 dtype

如果字符串 dtype 长度不足以存储转换为字符串的最大整数/浮点值,则can_cast函数现在在“安全”转换模式下对整数/浮点 dtype 和字符串 dtype 返回 False。以前,在“安全”模式下,can_cast对整数/浮点 dtype 和任何长度的字符串 dtype 返回 True。

astype 和字符串 dtype

如果要转换为的字符串 dtype 在“安全”转换模式下不足以容纳要转换的整数/浮点数组的最大值,则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 版本。

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

为了匹配zeros函数,zeros_like现在返回一个用空字符串初始化的数组,而不是一个填充了*‘0’*的数组。

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

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

特殊标量浮点值不再导致向上转换为双精度

在以前的 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._check_fill_value 的两个更改:

  • 当填充值为字符串且数组类型不是‘OSUV’之一时,会引发 TypeError 而不是使用默认填充值。

  • 当填充值溢出数组类型时,会引发 TypeError 而不是 OverflowError。

多项式类不再从 PolyBase 派生

这可能会导致依赖于多项式类从 PolyBase 派生的人遇到问题。它们现在都是从抽象基类 ABCPolyBase 派生的。严格来说,应该涉及到弃用,但找不到使用旧基类的外部代码。

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

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

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

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

Argmin 和 argmax 输出参数

np.argminnp.argmax及其等效的 C-API 函数的out参数现在被检查以确切匹配所需的输出形状。如果检查失败,则会引发ValueError而不是TypeError

Einsum

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

索引

NumPy 索引在这个版本中进行了完全重写。这使得大多数高级整数索引操作更快,并且不应该有其他影响。然而,在高级索引操作中引入了一些微妙的变化和弃用:

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

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

  • 高级索引的迭代顺序过去总是 C 顺序。在 NumPy 1.9 中,迭代顺序会根据输入进行调整,并且不保证(除了一个单一高级索引,出于兼容性原因永远不会被反转)。这意味着如果将多个值分配给相同的元素,则结果是未定义的。一个例子是arr[[0, 0], [1, 1]] = [1, 2],这可能将arr[0, 1]设置为 1 或 2。

  • 与迭代顺序类似,高级索引结果的内存布局被调整以实现更快的索引,并且无法预测。

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

  • 将来,布尔数组类似物(例如 python 布尔列表)将始终被视为布尔索引,布尔标量(包括 python True)将是合法的布尔索引。此时,对于标量数组,这已经是这种情况,以允许一般的positive = a[a > 0]a是零维时起作用。

  • 在 NumPy 1.8 中,如果操作的结果是标量,可以使用array(True)array(False)等同于 1 和 0。在 NumPy 1.9 中,这将引发错误,并且如上所述,将来会被视为布尔索引。

  • 所有非整数数组类似物已被弃用,自定义整数类对象的对象数组可能必须显式转换。

  • 高级索引的错误报告更加详细,但在某些情况下错误类型已经发生了变化。(索引数组的广播错误报告为IndexError

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

非整数缩减轴索引已被弃用

对于像add.reducesum这样的缩减 ufunc 的非整数轴索引已被弃用。

promote_types和字符串 dtype

当给定一个整数或浮点数 dtype 作为一个参数,另一个参数作为字符串 dtype 时,promote_types函数现在返回一个有效的字符串长度。以前,即使输入的字���串 dtype 长度不足以存储转换为字符串的最大整数/浮点数值,它总是返回输入的字符串 dtype。

can_cast和字符串 dtype

can_cast函数现在在整数/浮点数 dtype 和字符串 dtype 的“安全”转换模式下返回 False,如果字符串 dtype 的长度不足以存储转换为字符串的最大整数/浮点数值。以前,在“安全”模式下,can_cast对整数/浮点数 dtype 和任何长度的字符串 dtype 返回 True。

astype 和字符串 dtype

在“安全”转换模式下,如果要转换为的字符串 dtype 长度不足以容纳正在转换的整数/浮点数数组的最大值,则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 版本。

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

为了匹配zeros函数,zeros_like现在返回一个用空字符串初始化的数组,而不是一个填充有*‘0’*的数组。

新功能

百分位数支持更多的插值选项

np.percentile现在具有插值关键字参数,用于指定如果百分位数落在两个值之间时应该如何插值点。请查看文档以获取可用选项。

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

np.mediannp.percentile现在支持类似 ufunc reductions 的广义轴参数自 1.7 起。现在可以说 axis=(index, index)来选择一个用于缩减的轴列表。还添加了keepdims关键字参数,以便方便地广播到原始形状的数组。

np.linspacenp.logspace添加了 dtype 参数

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

更通用的np.triunp.tril广播

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

tobytes方法的别名为tostring

ndarray.tobytesMaskedArray.tobytes已添加为tostring的别名,用于将数组导出为bytes。这在 Python 3 中更一致,因为strbytes不相同。

构建系统

增加了对 ppc64le 和 OpenRISC 架构的实验性支持。

兼容性到 python 的numbers模块

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

np.vander添加了increasing参数

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

np.unique添加了unique_counts参数

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

在 nanfunctions 中支持中位数和百分位数

np.nanmediannp.nanpercentile函数的行为类似于中位数和百分位数函数,只是忽略 NaN。

添加了 NumpyVersion 类

当 numpy 版本升级到 1.10.devel 时,该类可以从 numpy.lib 导入,并用于版本比较。例如:

>>> 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现在正确地广播其两个输入数组,即使它们具有不同的维度数量。在早期版本中,这将导致引发错误或计算错误的结果。

百分位数支持更多的插值选项

np.percentile现在具有插值关键字参数,用于指定如果百分位数落在两个值之间时应该如何插值点。请查看文档以获取可用选项。

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

np.mediannp.percentile 现在支持类似于 ufunc reductions 的广义轴参数,自 1.7 版本开始。现在可以使用 axis=(index, index) 来选择要减少的轴列表。keepdims 关键字参数也被添加,以便方便地广播到原始形状的数组。

np.linspacenp.logspace 添加了 Dtype 参数。

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

更一般的 np.triunp.tril 广播。

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

tobytestostring 方法的别名。

ndarray.tobytesMaskedArray.tobytes 已添加为 tostring 的别名,用于将数组导出为 bytes。这在 Python 3 中更一致,因为 strbytes 不相同。

构建系统

添加了对 ppc64le 和 OpenRISC 架构的实验性支持。

与 python numbers 模块的兼容性

所有数值 numpy 类型现在都在 python numbers 模块中注册。

np.vander 添加了 increasing 参数。

可以使用这个新的布尔参数指定范德蒙德矩阵的列的顺序。

np.unique 添加了 unique_counts 参数。

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

nanfunctions 中支持中位数和百分位数。

np.nanmediannp.nanpercentile 函数的行为类似于中位数和百分位数函数,只是会忽略 NaN 值。

添加了 NumpyVersion 类。

当 numpy 版本升级到 1.10.devel 时,该类可以从 numpy.lib 中导入,并用于版本比较。例如:

>>> 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 现在正确地广播其两个输入数组,即使它们具有不同数量的维度。在早期版本中,这将导致引发错误或计算错误的结果。

改进

在某些情况下,对于 sum 的更好数值稳定性。

现在在 sum 方法中使用成对求和,但仅沿着快速轴和长度小于等于 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中的协方差检查

当协方差矩阵不是半正定时,会引发RuntimeWarning警告。

多项式类不再基于模板

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

更多的 GIL 释放

现在有更多函数释放全局解释器锁,允许使用threading模块更有效地并行化。最值得注意的是现在对花式索引、np.whererandom模块释放了 GIL,现在使用每个状态锁而不是 GIL。

更复杂基类的 MaskedArray 支持

内置假设基类的行为类似于普通数组的假设正在被移除。特别是,reprstr现在应该更可靠地工作。

C-API

在某些情况下,对 sum 的数值稳定性更好

现在在 sum 方法中使用了 Pairwise summation,但仅沿着快速轴,并且对长度<=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中的协方差检查

当协方差矩阵不是半正定时,会引发RuntimeWarning警告。

多项式类不再基于模板

多项式类已经重构,使用抽象基类而不是模板,以实现一个通用接口。这使得导入多项式包更快,因为在导入时不需要编译这些类。

更多 GIL 释放

现在有几个函数释放全局解释器锁,允许使用threading模块更有效地并行化。特别是现在对花式索引、np.whererandom模块释放了 GIL,现在使用每个状态锁而不是 GIL。

MaskedArray 对更复杂的基类的支持

内置假设基类的行为类似于普通数组的假设正在被移除。特别是,reprstr现在应该更可靠地工作。

C-API

弃用

序列重复的非整数标量

使用非整数 numpy 标量重复 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中是相同对象,也将始终返回 False(并在将来引发错误)。

等号运算符*==将在将来引发类似np.equal*的错误,如果广播或元素比较等失败。

arr == None的比较将来将执行逐元素比较,而不仅仅返回 False。代码应该使用arr is None

所有这些更改目前将产生弃用或未来警告。

C-API

npy_PyFile_Dupnpy_PyFile_DupClose这两个实用函数被内部缓冲破坏,这是由 Python 3 应用于其文件对象的缓冲机制引起的。为了解决这个问题,在npy_3kcompat.h中声明了两个新函数npy_PyFile_Dup2npy_PyFile_DupClose2,同时弃用了旧函数。由于这些函数的脆弱性,建议尽可能使用 Python API。

这个更改已经应用于 1.8.1 版本。

序列重复的非整数标量

使用非整数 numpy 标量重复 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 是同一个对象,也会始终返回 False(并在未来引发错误)。

在未来,等号运算符 == 如果广播或元素比较等操作失败,将会引发类似 np.equal 的错误。

arr == None 的比较将来会执行逐元素比较,而不仅仅返回 False。代码应该使用 arr is None

所有这些改变目前都会产生 Deprecation- 或 FutureWarnings。

C-API

实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose 受到 Python 3 对其文件对象应用的内部缓冲的影响而出现问题。为了解决这个问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并弃用了旧函数。由于这些函数的脆弱性,建议尽可能使用 Python API。

这个改变已经应用于 1.8.1 版本。