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
属性#
如 gh-7083 中所述,赋值 'data' 属性是一个固有的不安全操作。此功能将在未来移除。
在 linspace
中对 num 属性进行不安全的整数转换#
当 num 无法安全地解释为整数时,np.linspace
现在会引发 DeprecationWarning。
对 binary_repr
的位宽参数不足#
如果传递给 binary_repr
的 'width' 参数不足以表示以 2 为底(正数)或 2 的补码(负数)形式的数字,则该函数过去会默默忽略该参数并返回使用该形式所需最小位数的表示。这种行为现在被认为对用户来说是不安全的,将来会引发错误。
未来的更改#
在 1.13 中,NAT 将始终比较为 False,除了
NAT != NAT
,这将为 True。简而言之,NAT 的行为将类似于 NaN。在 1.13 中,
np.average
将保留子类,以匹配大多数其他 numpy 函数(如 np.mean)的行为。特别是,这意味着返回标量的调用可能会返回 0 维子类对象。
结构化数组的多字段操作#
在 1.13 中,涉及多个字段的结构化数组的行为将以两种方式改变
首先,使用多个字段索引结构化数组(例如,arr[['f1', 'f3']]
)将在 1.13 中返回对原始数组的视图,而不是副本。请注意,返回的视图将具有对应于原始数组中中间字段的额外填充字节,这与 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]。使用非整数 array_like 进行索引会引发
IndexError
,例如a['1', '2']
使用多个省略号进行索引会引发
IndexError
,例如a[..., ...]
。用作索引值的非整数会引发
TypeError
,例如在reshape
、take
中,以及指定约简轴。
FutureWarning 到更改的行为#
np.full
现在返回填充值的 dtype 的数组,如果没有给出 dtype,而不是默认为 float。np.average
如果参数是 ndarray 的子类,则会发出警告,因为从 1.13 开始将保留子类。(参见未来的更改)
power
和 **
对整数到负整数幂引发错误#
之前的行为取决于是否涉及 numpy 标量整数或 numpy 整数数组。
对于数组
零到负整数幂返回最小整数。
1、-1 到负整数幂都返回正确的值。
其余整数在提升到负整数幂时返回零。
对于标量
零到负整数幂返回最小整数。
1、-1 到负整数幂都返回正确的值。
其余整数有时返回零,有时返回正确的浮点数,具体取决于整数类型的组合。
所有这些情况现在都会引发 ValueError
,除了那些公共类型为浮点数的整数组合,例如 uint64 和 int8。人们认为,简单的规则是最好的方法,而不是对整数单位有特殊的例外。如果您需要负幂,请使用非精确类型。
宽松的步幅检查是默认设置#
这将对假设 F_CONTIGUOUS
和 C_CONTIGUOUS
是互斥的并且可以设置为确定现在两者兼有的数组的默认顺序的代码产生一些影响。
针对精确索引修复了 np.percentile
的 'midpoint' 插值方法#
当两者重合时,'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
(在numpy存储库或源代码分发的根目录中)中的[blis]
部分。
numpy/__init__.py
中的钩子用于运行特定于发行版的检查#
numpy的二进制发行版可能需要在numpy初始化期间运行特定的硬件检查或加载特定的库。例如,如果我们使用需要SSE2指令的BLAS库分发numpy,我们希望检查numpy运行的机器是否具有SSE2,以便给出信息丰富的错误。
在numpy/__init__.py
中添加一个钩子,以导入一个numpy/_distributor_init.py
文件,该文件在标准numpy源代码中将保持为空(除了文档字符串),但可以被制作numpy二进制发行版的人员覆盖。
添加了新的nanfunctions nancumsum
和nancumprod
#
已添加Nan函数nancumsum
和nancumprod
,用于通过忽略nan来计算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版本中使用“ignore”过滤器忽略警告可能会很快导致这些(或类似的)警告无法可靠地进行测试。
上下文管理器允许过滤(以及记录)警告,类似于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
参数现在可以相互广播,并且每个指定的轴都会相应地进行偏移。
已为ndarray实现了__complex__
方法#
现在,对大小为1的数组调用complex()
将转换为Python复数。
现在支持pathlib.Path
对象#
标准的np.load
、np.save
、np.loadtxt
、np.savez
以及类似函数现在可以接受pathlib.Path
对象作为参数,而不是文件名或打开的文件对象。
为np.finfo
添加了新的bits
属性#
这使得np.finfo
与已具有该属性的np.iinfo
保持一致。
为np.vectorize
添加了新的signature
参数#
此参数允许使用核心维度对用户定义的函数进行矢量化,其风格类似于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中的bytes#
以前,它在Python2中包含str(bytes)和unicode,但在Python3中只包含str(unicode)。
改进#
bitwise_and
标识已更改#
之前的标识是1,结果是当使用reduce方法时,除了LSB之外的所有位都被屏蔽。新的标识是-1,它应该在二进制补码机器上正常工作,因为所有位都将设置为1。
广义Ufuncs现在将解锁GIL#
广义Ufuncs,包括linalg模块的大部分内容,现在将解锁Python全局解释器锁。
np.fft中的缓存现在在总大小和项目数量方面受到限制#
用于加速相同长度的连续FFT的np.fft中的缓存不再可以无限增长。它们已被替换为LRU(最近最少使用)缓存,如果内存大小或项目数量限制已达到,则会自动逐出不再需要的项目。
改进了对零宽度字符串/unicode类型的处理#
修复了几个明确禁止使用零宽度字符串类型的数组的接口(即dtype('S0')
或dtype('U0')
),并修复了几个此类类型未被正确处理的错误。特别是,更改了ndarray.__new__
,使其在创建新数组时不会隐式地将dtype('S0')
转换为dtype('S1')
(unicode也一样)。
使用AVX2矢量化的整数ufunc#
如果CPU在运行时支持,则基本的整数ufunc现在将使用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
。
快速排序已更改为introsort#
np.sort
和np.argsort
的快速排序类型现在是introsort,它是常规的快速排序,但在没有取得足够进展时会更改为堆排序。这保留了良好的快速排序性能,同时将最坏情况下的运行时间从O(N^2)
更改为O(N*log(N))
。
ediff1d
性能和子类处理改进#
ediff1d函数使用数组而不是平面迭代器进行减法。当to_begin或to_end不为None时,减法将就地执行以消除复制操作。一个副作用是某些子类得到了更好的处理,即astropy.Quantity,因为创建了完整的数组、包装,然后设置开始和结束值,而不是使用concatenate。
改进了float16数组ndarray.mean
的精度#
现在使用float32计算float16数组的平均值,以提高精度。这在诸如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。
警告的stacklevel增加#
基于python的警告的stacklevel已增加,因此大多数警告将报告用户代码的出错行,而不是发出警告本身的行。现在测试stacklevel的传递,以确保新的警告将接收stacklevel
参数。
这导致使用“default”或“module”筛选器的警告对每一行出错的用户代码或用户模块显示一次,而不是只显示一次。在3.4之前的python版本上,这可能会导致以前被错误忽略的警告出现,这可能会令人惊讶,尤其是在测试套件中。