NumPy 1.12.0 发行说明#
此版本支持 Python 2.7 和 3.4 - 3.6.
亮点#
NumPy 1.12.0 版本包含大量修复和改进,但很少有能超越其他所有改进的.这使得挑选亮点有些随意,但以下内容可能特别有趣,或者表明可能会有未来影响的领域.
np.einsum
中的操作顺序现在可以被优化,以实现大幅度的速度提升.np.vectorize
的新signature
参数用于向量化核心维度.keepdims
参数被添加到许多函数中.用于测试警告的新上下文管理器
在 numpy.distutils 中对 BLIS 的支持
对 PyPy 的支持有了很大改进(尚未完成)
停止支持#
已不再支持 Python 2.6、3.2 和 3.3.
添加支持#
已添加对 PyPy 2.7 v5.6.0 的支持.虽然还不完整(nditer
updateifcopy
尚不支持),但这是 PyPy 的 C-API 兼容层的一个重要里程碑.
构建系统变更#
库的顺序被保留,而不是被重新排序以匹配目录的顺序.
弃用#
ndarray 对象的 data
属性的赋值#
分配 ‘data’ 属性本质上是不安全的操作,如 gh-7083 所指出的.这种能力将在未来被移除.
在 linspace
中对 num 属性的不安全整数转换#
np.linspace
现在在 num 不能安全地解释为整数时会引发 DeprecationWarning.
binary_repr
的位宽参数不足#
如果向 binary_repr
传递了一个不足以在二进制(正数)或二进制补码(负数)形式中表示该数的 ‘width’ 参数,该函数过去会默默忽略该参数并返回使用该形式所需的最少位数的表示.从用户的角度来看,这种行为现在被认为是危险的,将来会引发错误.
未来变化#
在1.13中,NAT将始终比较为False,除了
NAT != NAT
,这将返回True.简而言之,NAT的行为将类似于NaN.在 1.13 版本中,``np.average`` 将保留子类,以匹配大多数其他 numpy 函数(如 np.mean)的行为.特别是,这意味着返回标量的调用现在可能返回一个 0 维的子类对象.
结构化数组的多字段操作#
在1.13中,涉及多个字段的有结构数组的行为将以两种方式改变:
首先,在1.13版本中,使用多个字段(例如,``arr[[‘f1’, ‘f3’]]``)索引结构化数组将返回原始数组的视图,而不是副本.请注意,返回的视图将包含与原始数组中介入字段对应的额外填充字节,这与1.12版本中的副本不同,这将影响诸如``arr[[‘f1’, ‘f3’]].view(newdtype)``的代码.
其次,对于 numpy 版本 1.6 到 1.12,结构化数组之间的赋值是”按字段名称”进行的:目标数组中的字段被设置为源数组中同名字段,如果源数组没有该字段,则设置为 0:
>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')])
在1.13中,赋值将改为”按位置”进行:目标的第N个字段将被设置为源的第N个字段,而不考虑字段名称.可以通过在赋值前使用索引重新排序字段来获得旧的行为,例如,``b[[‘x’, ‘y’]] = a[[‘y’, ‘x’]]``.
兼容性说明#
将DeprecationWarning转换为错误#
使用浮点数进行索引会引发
IndexError
,例如,a[0, 0.0].使用非整数类数组索引会引发
IndexError
,例如,a['1', '2']
使用多个省略号进行索引会引发
IndexError
,例如,a[..., ...]
.用作索引值的非整数会引发
TypeError
,例如,在reshape
、take
和指定减少轴时.
FutureWarning 到行为改变#
np.full
现在在没有给出dtype的情况下,返回一个填充值dtype的数组,而不是默认的浮点数.np.average
如果在参数是 ndarray 的子类时会发出警告,因为从 1.13 版本开始,子类将被保留.(见未来更改)
power
和 **
对于整数到负整数幂会引发错误#
之前的行为取决于是否涉及 numpy 标量整数或 numpy 整数数组.
对于数组
零到负整数次幂返回最小整数值.
1 和 -1 到负整数次幂都返回了正确的值.
其余的整数在负整数次幂时返回零.
对于标量
零到负整数次幂返回最小整数值.
1 和 -1 到负整数次幂都返回了正确的值.
剩余的整数有时返回零,有时根据整数类型组合返回正确的浮点数.
除了那些公共类型为浮点数的整数组合(例如 uint64 和 int8)之外,所有这些情况现在都会引发 ValueError
.人们认为简单的规则是最好的方式,而不是为整数单位设置特殊例外.如果你需要负幂,请使用不精确的类型.
宽松的步幅检查是默认的#
这将对假设 F_CONTIGUOUS
和 C_CONTIGUOUS
是互斥的并且可以设置以确定现在两者兼有的数组的默认顺序的代码产生一些影响.
np.percentile
的 ‘中点’ 插值方法已修复用于精确索引#
当两者一致时,’midpoint’ 插值器现在给出与 ‘lower’ 和 ‘higher’ 相同的结果.修复了之前 ‘lower’ + 0.5 的行为.
keepdims
kwarg 被传递给用户类方法#
接受 keepdims
kwarg 的 numpy 函数现在会将该值传递给 ndarray 子类上的相应方法.以前,``keepdims`` 关键字会被静默丢弃.这些函数现在具有以下行为:
如果用户没有提供
keepdims
,则不会向底层方法传递关键字.任何用户提供的
keepdims
值都作为关键字参数传递给方法.
如果方法不支持 keepdims
kwarg,而用户明确传入了 keepdims
,则会引发此情况.
以下函数已更改:sum
、product
、sometrue
、alltrue
、any
、all
、amax
、amin
、prod
、mean
、std
、var
、nanmin
、nanmax
、nansum
、nanprod
、nanmean
、nanmedian
、nanvar
、nanstd
bitwise_and
标识已更改#
之前的标识是1,现在是-1.更多解释请参见改进条目.
ma.median 在遇到未屏蔽的无效值时会发出警告并返回 nan#
与未屏蔽的中位数类似,屏蔽的中位数 ma.median 现在会发出运行时警告并在存在未屏蔽的 NaN 的切片中返回 NaN.
assert_almost_equal
中更大的统一性#
标量的精度检查已更改为与数组的精度检查相匹配.现在是:
abs(actual - desired) < 1.5 * 10**(-decimal)
请注意,这与之前文档中的描述相比更为宽松,但与之前在 assert_array_almost_equal
中使用的实现一致.由于实现的改变,一些非常微妙的测试可能会失败,而之前这些测试不会失败.
NoseTester
在测试期间警告的行为#
当 raise_warnings="develop"
被指定时,所有未捕获的警告现在都将被视为测试失败.以前只有选定的警告会被引发.未捕获或引发的警告(主要是在发布模式下)将在测试周期中显示一次,类似于默认的Python设置.
assert_warns
和 deprecated
装饰器更具体#
assert_warns
函数和上下文管理器现在对给定的警告类别更加具体.这种增加的具体性导致它们根据外部的警告设置进行处理.这意味着在给定并忽略错误类别的警告的情况下,可能不会引发警告.或者,增加的具体性可能意味着原本被错误忽略的警告现在会被显示或引发.另请参阅新的 suppress_warnings
上下文管理器.``deprecated`` 装饰器也是如此.
C API#
无变化.
新功能#
as_strided
的可写关键字参数#
np.lib.stride_tricks.as_strided
现在有一个 writeable
关键字参数.当不期望对返回的数组进行写操作时,可以将其设置为 False 以避免意外的不可预测的写操作.
rot90
的 axes
关键字参数#
在 rot90
中的 axes
关键字参数决定了数组旋转的平面.它默认值为 axes=(0,1)
,与原函数相同.
广义的 flip
#
flipud
和 fliplr
分别沿 axis=0 和 axis=1 反转数组的元素.新添加的 flip
函数沿任意给定的轴反转数组的元素.
np.count_nonzero
现在有一个axis
参数,允许在不仅仅是展平的数组对象上生成非零计数.
numpy.distutils
中的 BLIS 支持#
现在支持针对BLIS库提供的BLAS实现进行构建.请参见 site.cfg.example
中的 [blis]
部分(在numpy仓库或源分发的根目录中).
在 numpy/__init__.py
中挂钩以运行特定于分发的检查#
numpy 的二进制分发版在 numpy 初始化期间可能需要运行特定的硬件检查或加载特定的库.例如,如果我们使用需要 SSE2 指令的 BLAS 库分发 numpy,我们希望检查运行 numpy 的机器是否具有 SSE2,以便提供信息性错误.
在 numpy/__init__.py
中添加一个钩子,导入一个 numpy/_distributor_init.py
文件,该文件在标准的 numpy 源代码中将保持为空(除了一个文档字符串),但可以被制作 numpy 二进制发行版的人覆盖.
新增了新的纳米函数 nancumsum
和 nancumprod
#
Nan-函数 nancumsum
和 nancumprod
已被添加,用于在忽略 nans 的情况下计算 cumsum
和 cumprod
.
np.interp
现在可以插值复数值#
np.lib.interp(x, xp, fp)
现在允许插值数组 fp
为复数,并且将以 complex128
精度进行插值.
新增多项式求值函数 polyvalfromroots
#
新的函数 polyvalfromroots
从多项式的根在给定点处计算多项式.这对于高阶多项式非常有用,因为在机器精度下展开成多项式系数是不准确的.
新增数组创建函数 geomspace
#
新的函数 geomspace
生成一个几何序列.它类似于 logspace
,但直接指定起始和结束:geomspace(start, stop)
的行为与 logspace(log10(start), log10(stop))
相同.
用于测试警告的新上下文管理器#
一个新的上下文管理器 suppress_warnings
已被添加到测试工具中.这个上下文管理器旨在帮助可靠地测试警告.具体来说,是为了可靠地过滤/忽略警告.在 3.4.x 之前的 Python 版本中,使用”忽略”过滤器忽略警告会很快导致这些(或类似的)警告无法被可靠地测试.
上下文管理器允许过滤(以及记录)警告,类似于 catch_warnings
上下文,但允许更容易的具体性.此外,打印未被过滤的警告或嵌套上下文管理器将按预期工作.此外,还可以将上下文管理器用作装饰器,这在多个测试需要隐藏相同警告时非常有用.
新增掩码数组函数 ma.convolve
和 ma.correlate
#
这些函数包装了非掩码版本,但通过掩码值传播.有两种不同的传播模式.默认情况下,掩码值会用掩码污染结果,但另一种模式只有在没有替代方案时才输出掩码.
新的 float_power
ufunc#
新的 float_power
ufunc 类似于 power
函数,除了所有计算都在至少 float64 的精度下完成.在 numpy 邮件列表上有一个长时间的讨论,关于如何处理整数到负整数幂的问题,一个流行的提议是 __pow__
运算符应该总是返回至少 float64 精度的结果.``float_power`` 函数实现了这个选项.请注意,它不支持对象数组.
np.loadtxt
现在支持将单个整数作为 usecol
参数#
现在可以使用 usecol=n
来读取文件的第 n 列,而不是使用 usecol=(n,)
.当传递非整数作为列索引时,错误消息也更加用户友好.
改进了 histogram
的自动分箱估计器#
通过 bins
参数为 histogram
添加了 ‘doane’ 和 ‘sqrt’ 估计器.添加了对范围限制直方图的自动分箱估计的支持.
np.roll
现在可以同时滚动多个轴#
roll
的 shift
和 axis
参数现在相互广播,每个指定的轴相应地进行移位.
__complex__
方法已为 ndarrays 实现#
对大小为1的数组调用 complex()
现在会转换为python复数.
pathlib.Path
对象现在已支持#
标准的 np.load
, np.save
, np.loadtxt
, np.savez
以及类似函数现在可以接受 pathlib.Path
对象作为参数,而不是文件名或打开的文件对象.
np.finfo
的 bits
新属性#
这使得 np.finfo
与已经具有该属性的 np.iinfo
保持一致.
新的 signature
参数用于 np.vectorize
#
此参数允许通过核心维度向量化用户定义的函数,类似于 NumPy 的 广义通用函数 .这允许向量化更广泛的函数.例如,一个将两个向量组合以产生标量的任意距离度量可以通过 signature='(n),(n)->()'
进行向量化.详见 np.vectorize
.
为整数数组的除法发出 py3kwarnings#
为了帮助人们将他们的代码库从 Python 2 迁移到 Python 3,python 解释器有一个方便的选项 -3,它会在运行时发出警告.其中一个警告是关于整数除法的:
$ python -3 -c "2/3"
-c:1: DeprecationWarning: classic int division
在 Python 3 中,新的整数除法语义也适用于 numpy 数组.在这个版本中,numpy 将发出类似的警告:
$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"
-c:1: DeprecationWarning: numpy: classic int division
numpy.sctypes 现在在 Python3 中也包含字节#
之前,它在 Python2 中包含 str(字节)和 unicode,但在 Python3 中只包含 str(unicode).
改进#
bitwise_and
标识已更改#
之前的标识是 1,结果是当使用 reduce 方法时,除了 LSB 之外的所有位都被屏蔽了.新的标识是 -1,这应该在二进制补码机器上正常工作,因为所有位都将设置为一.
通用化 Ufuncs 现在将解锁 GIL#
广义的 Ufuncs,包括大部分的 linalg 模块,现在将解锁 Python 全局解释器锁.
np.fft 中的缓存现在在总大小和项目数量上是有界的#
np.fft 中加速相同长度连续FFT的缓存不再无限制增长.它们已被LRU(最近最少使用)缓存取代,如果达到内存大小或项目数量限制,这些缓存会自动淘汰不再需要的项目.
改进了对零宽度字符串/unicode dtypes的处理#
修复了几个明确禁止零宽度字符串数据类型数组(即 dtype('S0')
或 dtype('U0')
)的接口,并修复了几个未正确处理这些数据类型的错误.特别是,更改了 ndarray.__new__
以在创建新数组时不隐式地将 dtype('S0')
转换为 ``dtype(‘S1’)``(对于unicode也是如此).
使用 AVX2 矢量化的整数 ufuncs#
如果在运行时CPU支持,基本的整数ufuncs现在使用AVX2指令.此功能目前仅在使用GCC编译时可用.
在 np.einsum
中的操作顺序优化#
np.einsum
现在支持 optimize
参数,该参数将优化收缩顺序.例如,``np.einsum`` 会以单次通过的方式完成链式点积示例 np.einsum('ij,jk,kl->il', a, b, c)
,这将按 N^4
的比例缩放;然而,当 optimize=True
时,``np.einsum`` 将创建一个中间数组,以将这种缩放减少到 N^3
或有效地 np.dot(a, b).dot(c)
.使用中间张量来减少缩放的方法已应用于一般的 einsum 求和符号.更多详情请参见 np.einsum_path
.
quicksort 已被改为 introsort#
np.sort
和 np.argsort
的快速排序现在是一种内省排序,这是一种常规的快速排序,但在没有取得足够进展时会切换到堆排序.这保留了快速排序的良好性能,同时将最坏情况运行时间从 O(N^2)
改为 O(N*log(N))
.
ediff1d
提升了性能和子类处理#
ediff1d 函数使用数组而不是扁平迭代器进行减法.当 to_begin 或 to_end 不为 None 时,减法是就地执行的,以消除复制操作.一个副作用是某些子类处理得更好,特别是 astropy.Quantity,因为完整的数组被创建、包装,然后设置开始和结束值,而不是使用 concatenate.
提高了 ndarray.mean
对 float16 数组的精度#
现在,float16 数组的平均值计算以 float32 进行,以提高精度.这对于 Theano 等包应该是有用的,因为在这些包中,float16 的精度是足够的,并且其较小的占用空间是可取的.
变化#
所有类似数组的方法现在都以关键字参数的形式在 fromnumeric.py 中调用.#
在内部,fromnumeric.py 中的许多类似数组的方法被调用时使用了位置参数,而不是像它们的外部签名那样使用关键字参数.这导致下游的 ‘pandas’ 库在遇到 ‘numpy’ 兼容性问题时出现了复杂情况.现在,该模块中的所有类似数组的方法都使用关键字参数进行调用.
在大多数情况下,对 np.memmap 对象的操作会返回 numpy 数组.#
之前对 memmap 对象的操作会误导性地返回一个 memmap 实例,即使结果实际上不是内存映射的.例如,``arr + 1`` 或 arr + arr
会返回 memmap 实例,尽管输出数组的内存没有被内存映射.版本 1.12 从这些操作中返回普通的 numpy 数组.
此外,对 memmap 的减少操作(例如 .sum(axis=None)
)现在返回一个 numpy 标量而不是一个 0d memmap.
警告的堆栈级别增加#
python 基础警告的 stacklevel 已增加,以便大多数警告将报告用户代码中的违规行,而不是警告本身给出的行.现在测试传递 stacklevel 以确保新的警告将接收 stacklevel
参数.
这会导致在使用”default”或”module”过滤器时,每个有问题的用户代码行或用户模块都会显示一次警告,而不是只显示一次.在3.4之前的Python版本中,这可能会导致之前被错误忽略的警告出现,这在测试套件中尤其令人惊讶.