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 版本中返回可写的视图.
S 和/或 a 数据类型可能被改为表示 Python 字符串而不是字节,在 Python 3 中这两种类型非常不同.
兼容性说明#
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 状态 vs. numpy < 1.9#
生成二项随机变量的算法中的一个错误已被修复.这一更改可能会改变执行的随机抽取次数,因此在调用 distribution.c::rk_binomial_btpe 后序列位置将有所不同.任何依赖于 RNG 处于已知状态的测试都应进行检查和/或更新.
随机种子强制为32位无符号整数#
np.random.seed
和 np.random.RandomState
现在如果种子不能安全地转换为 32 位无符号整数,则会抛出 ValueError
.现在失败的应用程序可以通过将更高的 32 位值屏蔽为零来修复:seed = seed & 0xFFFFFFFF
.这是在旧版本中默默执行的操作,因此随机流保持不变.
Argmin 和 argmax 输出参数#
np.argmin
和 np.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
)将成为合法的 布尔 索引.目前,对于标量数组,这已经是这种情况,以允许在a
为零维时positive = a[a > 0]
正常工作.在 NumPy 1.8 中,可以使用
array(True)
和array(False)
等同于 1 和 0,如果操作的结果是标量.这在 NumPy 1.9 中将引发错误,并且如上所述,将来会作为布尔索引处理.所有非整数类数组已被弃用,自定义整数类对象数组可能需要显式转换.
高级索引的错误报告更加详细,然而在某些情况下错误类型已经改变.(索引数组的广播错误报告为
IndexError
)使用多个省略号 (
...
) 进行索引已被弃用.
非整数缩减轴索引已被弃用#
像 add.reduce 或 sum 这样的归约 ufuncs 的非整数轴索引已被弃用.
promote_types
和字符串 dtype#
promote_types
函数现在在给定一个整数或浮点数 dtype 作为一个参数,另一个参数为字符串 dtype 时,返回一个有效的字符串长度.以前它总是返回输入的字符串 dtype,即使它不够长以存储转换为字符串的最大整数/浮点数值.
can_cast
和字符串 dtype#
can_cast
函数现在在”安全”转换模式下,对于整数/浮点数 dtype 和字符串 dtype,如果字符串 dtype 长度不足以存储转换为字符串的最大整数/浮点数值,则返回 False.以前在”安全”模式下,``can_cast`` 对于任何长度的整数/浮点数 dtype 和字符串 dtype 都返回 True.
astype 和字符串 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
对于字符串数据类型现在返回空字符串#
为了匹配 zeros 函数,`zeros_like` 现在返回一个用空字符串初始化的数组,而不是一个填充了 ‘0’ 的数组.
新功能#
Percentile 支持更多的插值选项#
np.percentile
现在有 interpolation 关键字参数,用于指定当百分位数落在两个值之间时,应以何种方式插值.请参阅文档以了解可用的选项.
中位数和百分位数的广义轴支持#
np.median
和 np.percentile
现在支持像 ufunc 缩减那样的广义轴参数,自 1.7 版本起.现在可以说 axis=(index, index) 来选择缩减的轴列表.还添加了 keepdims
关键字参数,以便方便地广播到原始形状的数组.
Dtype 参数已添加到 np.linspace
和 np.logspace
#
linspace
和 logspace
函数的返回数据类型现在可以使用 dtype 参数指定.
更通用的 np.triu
和 np.tril
广播#
对于 ndim
超过 2 的数组,这些函数现在将应用于最后两个轴,而不是引发异常.
tobytes
是 tostring
方法的别名#
ndarray.tobytes
和 MaskedArray.tobytes
已被添加为 tostring
的别名,用于将数组导出为 bytes
.这在 Python 3 中更为一致,因为 str
和 bytes
是不同的.
构建系统#
增加了对 ppc64le 和 OpenRISC 架构的实验性支持.
与python numbers
模块的兼容性#
现在,所有数值型的 numpy 类型都在 python numbers
模块中的类型层次结构中注册了.
increasing
参数添加到 np.vander
#
Vandermonde 矩阵的列顺序可以用这个新的布尔参数指定.
unique_counts
参数已添加到 np.unique
#
现在可以作为可选返回值获取每个唯一项在输入中出现的次数.
在 nanfunctions 中支持中位数和百分位数#
np.nanmedian
和 np.nanpercentile
函数的行为类似于中位数和百分位数函数,只不过忽略了 NaNs.
添加了 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
中的协方差检查#
当协方差矩阵不是半正定时,会引发 RuntimeWarning
警告.
多项式类不再基于模板#
多项式类已被重构,以使用抽象基类而不是模板来实现通用接口.这使得导入多项式包更快,因为类不需要在导入时编译.
更多 GIL 释放#
现在有几个更多的函数释放了全局解释器锁,允许使用 threading
模块进行更有效的并行化.最值得注意的是,对于花式索引、np.where
以及 random
模块现在使用每个状态锁而不是全局解释器锁,全局解释器锁现在被释放了.
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#
实用函数 npy_PyFile_Dup 和 npy_PyFile_DupClose 被 Python 3 应用于其文件对象的内部缓冲破坏了.为了修复这个问题,在 npy_3kcompat.h 中声明了两个新函数 npy_PyFile_Dup2 和 npy_PyFile_DupClose2,并且旧函数已被弃用.由于这些函数的脆弱性,建议尽可能使用 Python API.
此更改已应用于 1.8.1 版本.