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
ufunc 用于测试 NaT 特殊值.新的
np.heaviside
ufunc 计算 Heaviside 函数.新的
np.isin
函数,改进了in1d
.新的
np.block
函数用于创建块数组.新增
PyArray_MapIterArrayCopyIfOverlap
到 NumPy C-API.
详情请见下方.
弃用#
调用
np.fix
、np.isposinf
和np.isneginf
时使用f(x, y=out)
已被弃用 - 应将参数作为f(x, out=out)
传递,这与其它类似 ufunc 的接口匹配.自版本1.7起不推荐使用的C-API
NPY_CHAR
类型编号现在将在运行时引发弃用警告.使用旧版f2py构建的扩展需要重新编译以消除警告.np.ma.argsort
、np.ma.minimum.reduce
和np.ma.maximum.reduce
在应用于超过 2 维的数组时,应使用显式的 axis 参数调用,因为这个参数的默认值 (None
) 与其他 numpy 的默认值 (-1
、0
和0
) 不一致.np.ma.MaskedArray.mini
已被弃用,因为它几乎重复了np.MaskedArray.min
的功能.完全等效的行为可以通过np.ma.minimum.reduce
获得.np.ma.minimum
和np.ma.maximum
的单参数形式已被弃用.``np.maximum``.``np.ma.minimum(x)`` 现在应写作np.ma.minimum.reduce(x)
,这与使用np.minimum
的方式一致.在非数值类型上调用
ndarray.conjugate
已被弃用(它应与np.conjugate
的行为匹配,后者会抛出错误).当
axis
关键字不满足-a.ndim - 1 <= axis <= a.ndim
时调用expand_dims
,其中a
是被重塑的数组,已被弃用.
未来变化#
在 NumPy 1.14 中,具有不同字段名称的结构化数组之间的赋值将发生变化.以前,dst 中的字段会被设置为 src 中同名字段的值.在 numpy 1.14 中,字段将改为按 位置 赋值:dst 的第 n 个字段将被设置为 src 数组的第 n 个字段.请注意,NumPy 1.12 中引发的
FutureWarning
错误地将此更改报告为计划在 NumPy 1.13 中进行,而不是 NumPy 1.14.
构建系统变更#
numpy.distutils
现在会自动使用与GCC兼容的编译器确定C文件的依赖关系.
兼容性说明#
错误类型变化#
numpy.hstack()
现在在输入为空时抛出ValueError
而不是IndexError
.当带有轴参数的函数超出该参数的范围时,现在会抛出
np.AxisError
而不是混合使用IndexError
和ValueError
.为了向后兼容,``AxisError`` 是这两个类的子类.
Tuple 对象数据类型#
已经移除了对某些无意中允许的模糊 dtypes 的支持,这些 dtypes 的形式为 (old_dtype, new_dtype)
,其中任何一个 dtypes 是或包含 object
dtype.作为例外,形式为 (object, [('name', object)])
的 dtypes 仍然支持,因为有证据表明存在现有使用.
将 DeprecationWarning 转为错误#
更多详情请参见更改部分.
partition
,当使用非整数分区索引时引发 TypeError.NpyIter_AdvancedNew
,当oa_ndim == 0
且op_axes
为 NULL 时,引发 ValueErrornegative(bool_)
,当对布尔值应用负值时TypeError.subtract(bool_, bool_)
,从布尔值中减去布尔值时TypeError.np.equal, np.not_equal
,对象标识不会覆盖失败的比较.np.equal, np.not_equal
,对象标识不会覆盖非布尔比较.已弃用的布尔索引行为已删除.详情请参见下面的更改.
已弃用的
np.alterdot()
和np.restoredot()
已移除.
FutureWarning 到行为改变#
更多详情请参见更改部分.
numpy.average
保留子类array == None
和array != None
进行逐元素比较.np.equal, np.not_equal
,对象标识不会覆盖比较结果.
dtypes 现在总是为真#
之前 bool(dtype)
会回退到默认的 Python 实现,该实现检查 len(dtype) > 0
.由于 dtype
对象将 __len__
实现为记录字段的数量,标量 dtypes 的 bool
会评估为 False
,这是不直观的.现在所有 dtypes 的 bool(dtype) == True
.
__getslice__
和 __setslice__
在 ndarray
子类中不再需要#
在 Python 2.7 中子类化 np.ndarray 时,不再 _需要_ 在派生类上实现 __*slice__
,因为 __*item__
将正确拦截这些调用.
任何实现了这些的代码将和以前一样工作.调用 ndarray.__getslice__
的代码(例如通过 super(...).__getslice__
)现在将发出一个 DeprecationWarning - 应该使用 .__getitem__(slice(start, end))
代替.
使用 ...
(省略号) 索引 MaskedArrays/常量 现在返回 MaskedArray#
这种行为反映了 np.ndarray 的行为,并考虑了对象 dtype 的 MaskedArrays 中的嵌套数组,以及与其它索引形式结合的省略号.
C API 变化#
空数组上的GUfuncs和NpyIter轴移除#
现在允许从 NpyIter 中移除一个零大小的轴.这可能意味着在从 NpyIter 中移除轴的代码在稍后访问移除的维度时必须添加一个额外的检查.
最大的后续更改是,现在允许 gufuncs 具有零大小的内部维度.这意味着 gufunc 现在必须预料到空内部维度,而以前这是不可能的,并且会引发错误.
对于大多数广义函数,不需要进行更改.然而,现在对于签名如 (..., 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 13 和文档.
新的 positive
ufunc#
这个ufunc对应于一元`+`,但与ndarray上的`+`不同,如果数组值不支持数值操作,它将引发错误.
新的 divmod
ufunc#
这个 ufunc 对应于 Python 内置的 divmod,并用于在调用 numpy 数组时实现 divmod.``np.divmod(x, y)`` 计算的结果相当于 (np.floor_divide(x, y), np.remainder(x, y))
,但比单独调用这些函数大约快两倍.
np.isnat
ufunc 测试 NaT 特殊的日期时间和时间增量值#
新的 ufunc np.isnat
在 datetime 和 timedelta 数组中找到特殊 NaT 值的位置.这类似于 np.isnan
.
np.heaviside
ufunc 计算 Heaviside 函数#
新的函数 np.heaviside(x, h0)
(一个 ufunc)计算 Heaviside 函数:
{ 0 if x < 0,
heaviside(x, h0) = { h0 if x == 0,
{ 1 if x > 0.
np.block
函数用于创建块数组#
在当前的堆叠函数 vstack
、hstack
和 stack
中添加一个新的 block
函数.这允许同时跨多个轴进行连接,语法类似于数组创建,但元素本身可以是数组.例如:
>>> 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
函数,改进了 in1d
#
新函数 isin
测试一个 N 维数组的每个元素是否存在于第二个数组的任何位置.它是 in1d
的增强版,保留了第一个数组的形状.
临时省略#
在提供 backtrace
函数的平台上,NumPy 将尝试避免在涉及基本数值类型的表达式中创建临时变量.例如 d = a + b + c
被转换为 d = a + b; d += c
,这可以提高大数组的性能,因为执行操作所需的内存带宽较少.
unique
的 axes
参数#
在N维数组中,用户现在可以使用 numpy.unique
选择沿哪个轴查找重复的N-1维元素.如果 ``axis=None``(默认),则恢复原始行为.
np.gradient
现在支持不均匀间隔的数据#
用户现在可以为数据指定一个非恒定的间距.特别是 np.gradient
现在可以接受:
一个标量,用于指定所有维度的采样距离.
N 个标量来指定每个维度的恒定采样距离.即
dx
,dy
,dz
, …N 个数组用于指定沿 F 的每个维度的值的坐标.数组的长度必须与相应维度的大小匹配.
任何具有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
的函数返回.现在,它可以返回任意维度的数组(包括0维),并且这个数组的形状将替换正在迭代的数组的轴.
.ndim
属性添加到 dtype
以补充 .shape
#
为了与 ndarray
和 broadcast
保持一致,``d.ndim`` 是 len(d.shape)
的简写.
Python 3.6 中的 tracemalloc 支持#
NumPy 现在支持使用 Python 3.6 或更新版本的 tracemalloc 模块进行内存追踪.NumPy 的内存分配被放置在由 numpy.lib.tracemalloc_domain
定义的域中.请注意,NumPy 分配在较早的 Python 版本中的 tracemalloc 中不会显示.
NumPy 可以使用宽松的步长检查调试来构建.#
在环境变量中设置 NPY_RELAXED_STRIDES_DEBUG=1 当启用宽松步幅检查时,将导致 NumPy 编译时受影响的步幅设置为 npy_intp 的最大值,以帮助检测下游项目中步幅的无效使用.启用后,无效使用通常会导致错误被引发,但错误的具体类型取决于代码的细节.在实际应用中,已观察到 TypeError 和 OverflowError.
以前,这个选项在发布版本中是禁用的,在主分支中是启用的,并且在两者之间切换需要编辑代码.现在默认是禁用的,但可以为测试构建启用.
改进#
重叠输入的Ufunc行为#
在之前的NumPy版本中,由于数据依赖性问题,ufunc输入和输出操作数具有内存重叠的操作会产生未定义的结果.在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 扩展#
集成 Fortran 库的扩展现在可以使用免费的 MinGW 工具集构建,同样适用于 Python 3.5.这对于仅进行计算并且适度使用运行时的扩展效果最佳(例如,读写文件).请注意,这并不消除对 Mingwpy 的需求;如果你大量使用运行时,你很可能会遇到问题_.相反,这应被视为一个权宜之计,直到 Mingwpy 完全功能化.
扩展也可以使用 MinGW 工具集编译,使用来自 (可移动) WinPython 3.4 发行版的运行时库,这对于带有 PySide1/Qt4 前端的程序可能很有用.
packbits
和 unpackbits
的性能改进#
函数 numpy.packbits
在布尔输入和 numpy.unpackbits
已经优化,对于连续数据来说显著更快.
修复 PPC long double 浮点信息#
在NumPy的早期版本中,``finfo`` 函数在Power PC (PPC)上返回了关于 longdouble
浮点类型的 double double 格式的无效信息.无效值是由于NumPy算法未能处理有效位数中可变位数的特性,这是 PPC long doubles 的一个特点.此版本通过使用启发式方法检测PPC double double格式的存在,绕过了失败的算法.使用这些启发式方法的一个副作用是,``finfo`` 函数比以前的版本更快.
更好的 ndarray
子类的默认 repr#
没有 repr
专门化的 ndarray 子类现在可以正确地缩进其数据和类型行.
更可靠的掩码数组比较#
掩码数组的比较在掩码标量时存在错误,并且在维度高于一的结构化数组上失败.这两个问题现在都已解决.在此过程中,确保在获取结构化数组的结果时,掩码字段被正确忽略,即,如果两者中所有非掩码字段都相等,则结果相等,从而使行为与通过比较非结构化掩码数组然后在某些轴上执行 .all()
得到的行为相同.
使用字符串语法现在可以创建布尔元素的 np.matrix#
np.matrix
在尝试与布尔值一起使用时总是失败,例如 np.matrix('True')
.现在,这可以按预期工作.
更多的 linalg
操作现在接受空向量和矩阵#
在 np.linalg
中的以下所有函数现在都可以在给定最后两个维度中包含0的输入数组时正常工作:det
、slogdet
、pinv
、eigvals
、eigvalsh
、eig
、eigh
.
捆绑版本的 LAPACK 现在是 3.2.2#
NumPy 附带了一个最小实现的 lapack,适用于没有安装 lapack 库的系统,名为 lapack_lite
.这个实现已从 LAPACK 3.0.0(1999年6月30日)升级到 LAPACK 3.2.2(2010年6月30日).有关所有这些变化的详细信息,请参阅 LAPACK 更新日志.
虽然 numpy
没有通过新的功能暴露出来,但这修复了一些关于”工作区”大小的错误,并且在某些地方可能会使用更快的算法.
reduce
的 np.hypot.reduce
和 np.logical_xor
在更多情况下允许使用#
现在这可以在空数组上工作,返回0,并且可以减少多个轴.以前,在这些情况下会抛出 ValueError
.
更好的对象数组的 repr
#
包含自身的对象数组不再导致递归错误.
包含 list
对象的对象数组现在以一种方式打印,这种方式清楚地区分了二维对象数组和一维列表对象数组.
变化#
argsort
在掩码数组上的默认参数与 sort
相同#
默认情况下,``argsort`` 现在将掩码值放在排序数组的末尾,与 sort
已经做的相同.此外,``argsort`` 添加了 end_with
参数,以便与 sort
保持一致.请注意,此参数不是添加在末尾,因此会破坏任何将 fill_value
作为位置参数传递的代码.
average
现在保留子类#
对于 ndarray 子类,``numpy.average`` 现在将返回子类的一个实例,与大多数其他 NumPy 函数(如 mean
)的行为相匹配.因此,返回标量的调用现在也可能返回子类数组标量.
array == None
和 array != None
进行逐元素比较#
之前这些操作分别返回标量 False
和 True
.
np.equal, np.not_equal
对于对象数组忽略对象身份#
之前,这些函数总是将相同的对象视为相等.这导致了比较失败被覆盖,比较未返回布尔值的对象(如 np.arrays),以及比较结果与对象标识不同的对象(如 NaNs).
布尔索引更改#
布尔数组类(如python布尔值列表)始终被视为布尔索引.
布尔标量(包括 Python
True
)是合法的布尔索引,永远不会被视为整数.布尔索引必须与它们索引的轴的维度匹配.
在赋值的左侧使用的布尔索引必须与右侧的维度匹配.
布尔索引到标量数组返回一个新的1维数组.这意味着
array(1)[array(True)]
给出array([1])
而不是原始数组.
np.random.multivariate_normal
在协方差矩阵不良时的行为#
现在可以通过使用两个新的关键字参数来调整函数在处理协方差矩阵时的行为:
tol
可以在检查协方差矩阵是否为半正定时用于指定一个容差.check_valid
可以用来配置函数在遇到非半正定矩阵时的行为.有效选项是ignore
、warn
和raise
.默认值warn
保持了之前版本的行为.
assert_array_less
现在比较 np.inf
和 -np.inf
#
之前,``np.testing.assert_array_less`` 忽略了所有无限值.根据文档和直觉,这不是预期的行为.现在,-inf < x < inf 对于任何实数 x 都被认为是 True
,所有其他情况都会失败.
assert_array_
和掩码数组 assert_equal
隐藏较少的警告#
一些之前被 assert_array_
函数隐藏的警告现在不再隐藏.在大多数情况下,这些警告应该是正确的,如果出现,将需要对使用这些函数的测试进行更改.对于掩码数组的 assert_equal
版本,在比较 NaT 时可能会出现警告.该函数目前不具体处理 NaT 或 NaN,因此如果由于此更改而出现警告,最好暂时避免使用它.
memmap
对象中的 offset
属性值#
在 memmap
对象中的 offset
属性现在设置为文件中的偏移量.这只对大于 mmap.ALLOCATIONGRANULARITY
的偏移量有行为上的改变.
np.real
和 np.imag
对标量输入返回标量#
之前,当提供标量输入时,``np.real`` 和 np.imag
会返回数组对象,这与 np.angle
和 np.conj
等其他函数不一致.
多项式便利类不能传递给 ufuncs#
ABCPolyBase 类,便利类由此派生,设置了 __array_ufun__ = None
以选择退出 ufuncs.如果将多项式便利类实例作为参数传递给 ufunc,现在将引发 TypeError
.
ufunc 方法的输出参数也可以是元组#
对于 ufuncs 的调用,使用带有元组的 out
参数对于具有多个输出的 ufuncs 已经是可能的,并且是推荐的.现在这已经扩展到 reduce
、accumulate
和 reduceat
方法中的输出参数.这主要是为了与 __array_ufunc__
兼容;目前还没有具有多个输出的 ufuncs.