NumPy 1.9.0 版本说明#
此版本支持 Python 2.6 - 2.7 和 3.2 - 3.4。
亮点#
在各个领域进行了大量的性能改进,最值得注意的是索引和对小数组的操作速度显著提高。索引操作现在也释放了 GIL。
添加了nanmedian 和 nanpercentile,完善了 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 类,可用于此类比较。
diagonal 和 diag 函数将在 1.10.0 中返回可写视图。
在 Python 3 中,S 和/或 a 数据类型可能会更改为表示 Python 字符串而不是字节,这两种类型非常不同。
兼容性说明#
diagonal 和 diag 函数返回只读视图。#
在 NumPy 1.8 中,diagonal 和 diag 函数返回只读副本,在 NumPy 1.9 中返回只读视图,在 1.10 中将返回可写视图。
特殊标量浮点值不再导致向上转换为双精度#
在之前的 NumPy 版本中,涉及包含特殊值NaN
、Inf
和 -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.seed
和 np.random.RandomState
现在如果种子无法安全地转换为 32 位无符号整数,则会抛出 ValueError
。现在失败的应用程序可以通过将更高的 32 位值屏蔽为零来修复:seed = seed & 0xFFFFFFFF
。这在旧版本中是默默完成的,因此随机流保持不变。
Argmin 和 argmax 输出参数#
out
参数到 np.argmin
和 np.argmax
及其等效的 C-API 函数现在被检查以完全匹配所需的输出形状。如果检查失败,则会引发 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
)将是一个合法的布尔索引。目前,对于标量数组,这种情况已经存在,以允许在a
为零维时使用常规positive = a[a > 0]
。在 NumPy 1.8 中,如果操作的结果是标量,则可以使用
array(True)
和array(False)
等效于 1 和 0。这将在 NumPy 1.9 中引发错误,并且如上所述,将来将被视为布尔索引。所有非整数类数组都被弃用,自定义整数类对象的 object 数组可能必须显式转换。
高级索引的错误报告更具信息量,但是错误类型在某些情况下已更改。(索引数组的广播错误报告为
IndexError
)使用多个省略号(
...
)进行索引已被弃用。
非整数约简轴索引已被弃用#
对约简 ufunc(如add.reduce 或sum)的非整数轴索引已被弃用。
promote_types
和字符串 dtype#
promote_types
函数现在在给定一个整数或浮点 dtype 作为参数和一个字符串 dtype 作为另一个参数时返回有效的字符串长度。以前,它总是返回输入字符串 dtype,即使它不够长,无法存储转换为字符串的最大整数/浮点值。
can_cast
和字符串 dtype#
在“安全”转换模式下,如果字符串dtype的长度不足以存储转换为字符串的最大整数/浮点数的值,can_cast
函数现在返回 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_item
和 sq_ass_item
序列方法中的负索引#
当直接访问 sq_item
或 sq_ass_item
PyObject 插槽以获取项目时,将不再支持负索引。PySequence_GetItem
和 PySequence_SetItem
解决了负索引问题,因此可以在其中使用它们。
NDIter#
现在调用 NpyIter_RemoveAxis
时,迭代器范围将被重置。
当正在跟踪多索引并且迭代器未被缓冲时,可以使用 NpyIter_RemoveAxis
。在这种情况下,迭代器可以缩小尺寸。由于迭代器的总大小是有限制的,因此在这些调用之前,迭代器可能太大。在这种情况下,其大小将设置为 -1
,并且会在移除多索引、设置迭代器范围或获取下一个函数时发出错误,而不是在构造时发出错误。
这对当前有效的代码没有影响,但它突出了如果可能发生这些情况,则需要检查错误返回的必要性。在大多数情况下,被迭代的数组与迭代器一样大,因此不会出现此类问题。
此更改已应用于 1.8.1 版本。
zeros_like
用于字符串 dtype 现在返回空字符串#
为了与 zeros 函数匹配,zeros_like 现在返回用空字符串初始化的数组,而不是用 ‘0’ 填充的数组。
新功能#
百分位数支持更多插值选项#
np.percentile
现在具有 interpolation 关键字参数,用于指定如果百分位数落在两个值之间,应以何种方式对点进行插值。有关可用选项,请参阅文档。
中位数和百分位数的广义轴支持#
np.median
和 np.percentile
现在像 1.7 版本以来的 ufunc 缩减一样支持广义轴参数。现在可以指定 axis=(index, index) 来为缩减选择轴列表。keepdims
关键字参数也已添加,允许方便地广播到原始形状的数组。
向 np.linspace
和 np.logspace
添加 dtype 参数#
现在可以使用 dtype 参数指定 linspace
和 logspace
函数返回的数据类型。
更通用的 np.triu
和 np.tril
广播#
对于 ndim
超过 2 的数组,这些函数现在将应用于最后两个轴,而不是引发异常。
tobytes
是 tostring
方法的别名#
ndarray.tobytes
和 MaskedArray.tobytes
已添加为 tostring
的别名,后者将数组导出为 bytes
。这在 Python 3 中更一致,在 Python 3 中 str
和 bytes
不相同。
构建系统#
增加了对 ppc64le 和 OpenRISC 架构的实验性支持。
与 python numbers
模块的兼容性#
现在,所有数值 numpy 类型都已在 python numbers
模块中的类型层次结构中注册。
向 np.vander
添加 increasing
参数#
可以使用此新的布尔参数指定 Vandermonde 矩阵的列的顺序。
向 np.unique
添加 unique_counts
参数#
现在可以将每个唯一项目在输入中出现的次数作为可选返回值获得。
在 nanfunctions 中支持中位数和百分位数#
np.nanmedian
和 np.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
现在正确地广播其两个输入数组,即使它们具有不同数量的维度。在早期版本中,这将导致引发错误或计算错误的结果。
改进#
某些情况下求和的数值稳定性更好#
现在在 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 释放#
现在更多函数释放全局解释器锁 (GIL),允许使用 threading
模块进行更高效的并行化。最值得注意的是,现在为花式索引释放了 GIL,np.where
和 random
模块现在使用每个状态锁而不是 GIL。
对更复杂基类的 MaskedArray 支持#
正在移除关于基类行为类似于普通数组的内置假设。特别是,repr
和 str
现在应该更可靠地工作。
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
即使 a 和 b 中的数组是相同的对象,也将始终返回 False(将来会返回错误)。
如果广播或元素比较等失败,将来等号运算符 == 将像 np.equal 一样引发错误。
将来,与 arr == None 的比较将进行逐元素比较,而不是只返回 False。代码应该使用 arr is None。
所有这些更改目前都会给出弃用警告或未来警告。
C-API#
Python 3 应用于其文件对象的内部缓冲机制破坏了实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose。为了解决这个问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并且旧函数已被弃用。由于这些函数的脆弱性,建议尽可能使用 Python API。
此更改已应用于 1.8.1 版本。