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”参数不足以表示数字的二进制(正数)或二补码(负数)形式,则该函数以前会静默忽略该参数,并返回一种使用所选形式的最小位数表示。从用户角度来看,这种行为现在被认为是不安全的,并且将来会引发错误。
未来变化#
在 1.13 版本中,NAT 总是比较为 False,除了
NAT != NAT,它将为 True。简而言之,NAT 的行为将像 NaN。在 1.13 版本中,
np.average将保留子类,以匹配大多数其他 NumPy 函数(如 np.mean)的行为。特别地,这意味着以前返回标量(scalar)的调用现在可能返回一个 0-d 子类对象。
结构化数组的多字段操作#
在 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 升级为 Error#
使用浮点数索引将引发
IndexError,例如 a[0, 0.0]。使用非整数 array_like 索引将引发
IndexError,例如a['1', '2']。使用多个 ellipsis 索引将引发
IndexError,例如a[..., ...]。将非整数用作索引值将引发
TypeError,例如在reshape、take和指定 reduce 轴时。
FutureWarning 变为行为更改#
np.full在未指定 dtype 时,现在返回一个与 fill-value 相同 dtype 的数组,而不是默认为 float。np.average如果参数是 ndarray 的子类,则会发出警告,因为从 1.13 版本开始将保留子类(参见 Future Changes)。
power 和 ** 对整数到负整数幂引发错误#
之前的行为取决于涉及的是 NumPy 标量整数还是 NumPy 整数数组。
对于数组
零的负整数幂返回最小整数值。
1 和 -1 的负整数幂返回正确的值。
其余整数的负整数幂返回零。
对于标量
零的负整数幂返回最小整数值。
1 和 -1 的负整数幂返回正确的值。
其余整数有时返回零,有时返回正确的浮点数,具体取决于整数类型的组合。
所有这些情况现在都引发 ValueError,但整数组合的公共类型为浮点数(例如 uint64 和 int8)的情况除外。人们认为一个简单的规则比为整数单位设置特殊例外更好。如果您需要负幂,请使用非精确类型。
宽松的 stride 检查是默认设置#
这将对假定 F_CONTIGUOUS 和 C_CONTIGUOUS 互斥且可用于确定现在同为两者的数组的默认顺序的代码产生一些影响。
为精确索引修复了 np.percentile 的“midpoint”插值方法#
当“lower”和“higher”插值方法重合时,“midpoint”插值器现在给出与它们相同的结果。修复了之前“lower”+0.5 的行为。
keepdims 关键字参数被传递给用户类方法#
接受 keepdims 关键字参数的 NumPy 函数现在将该值传递给 ndarray 子类的相应方法。以前,keepdims 关键字会被静默忽略。这些函数现在具有以下行为:
如果用户未提供
keepdims,则不会将任何关键字传递给底层方法。用户提供的任何
keepdims值都将作为关键字参数传递给方法。
如果方法不支持 keepdims 关键字参数,而用户又显式传递了 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#
与未屏蔽的 median 类似,屏蔽的 median ma.median 现在会在包含未屏蔽 NaN 的切片中发出 Runtime 警告并返回 NaN。
在 assert_almost_equal 中提高了整体一致性#
标量的精度检查已更改为与数组的精度检查匹配。现在是:
abs(actual - desired) < 1.5 * 10**(-decimal)
请注意,这比以前的文档记录要宽松,但与 assert_array_almost_equal 中使用的先前实现一致。由于实现更改,一些非常精细的测试可能会失败,而以前不会。
NoseTester 在测试期间处理警告的行为#
当给出 raise_warnings="develop" 时,所有未捕获的警告现在都将被视为测试失败。以前只发出选定的警告。未被捕获或引发的警告(主要是在 release 模式下)将在测试周期中显示一次,类似于默认的 Python 设置。
assert_warns 和 deprecated 装饰器更具体#
现在,assert_warns 函数和上下文管理器对给定的警告类别更加具体。这种增加的特异性导致它们根据外部警告设置进行处理。这意味着在给出错误的类别警告并被外部忽略的情况下,可能不会发出任何警告。或者,增加的特异性可能意味着以前被错误忽略的警告现在将被显示或引发。另请参见新的 suppress_warnings 上下文管理器。对于 deprecated 装饰器也适用相同情况。
C API#
无更改。
新功能#
为 as_strided 添加了 writeable 关键字参数#
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 实现。请参阅 NumPy 存储库或源代码分发根目录中的 site.cfg.example 的 [blis] 部分。
numpy/__init__.py 中的钩子用于运行分发特定的检查#
NumPy 的二进制分发可能需要在 NumPy 初始化时运行特定的硬件检查或加载特定的库。例如,如果我们使用需要 SSE2 指令的 BLAS 库分发 NumPy,我们希望检查运行 NumPy 的机器是否具有 SSE2,以便给出信息性的错误。
在 numpy/__init__.py 中添加一个钩子来导入一个 numpy/_distributor_init.py 文件,该文件在标准的 NumPy 源代码中将保持为空(除了 docstring),但可以被制作 NumPy 二进制分发的人覆盖。
添加了新的 NaN 函数 nancumsum 和 nancumprod#
添加了 NaN 函数 nancumsum 和 nancumprod 来计算 cumsum 和 cumprod,忽略 NaN。
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。此上下文管理器旨在帮助可靠地测试警告。特别是,用于可靠地过滤/忽略警告。在 Python 3.4.x 之前的版本中使用“ignore”过滤器忽略警告可能会很快导致这些(或类似的)警告无法可靠地进行测试。
该上下文管理器允许像 catch_warnings 上下文一样过滤(以及记录)警告,但允许更轻松地进行特异性处理。此外,打印未过滤的警告或嵌套上下文管理器将按预期工作。另外,该上下文管理器还可以用作装饰器,这在多个测试需要隐藏同一警告时非常有用。
添加了新的掩码数组函数 ma.convolve 和 ma.correlate#
这些函数包装了非掩码版本,但会传播掩码值。有两种不同的传播模式。默认模式会导致掩码值污染结果,但另一种模式仅在没有替代方案时输出掩码。
新的 float_power ufunc#
新的 float_power ufunc 类似于 power 函数,但所有计算均以至少 float64 的精度进行。在 NumPy 邮件列表中关于如何处理整数到负整数幂的讨论很长,一个流行的提议是 __pow__ 运算符应始终返回至少 float64 精度的结果。float_power 函数实现了该选项。请注意,它不支持 object 数组。
np.loadtxt 现在支持将单个整数作为 usecol 参数#
现在可以使用 usecol=n 来读取文件的第 n 列,而不是使用 usecol=(n,)。当将非整数作为列索引传递时,错误消息也更加用户友好。
改进了 histogram 的自动分箱估计器#
通过 bins 参数向 histogram 添加了“doane”和“sqrt”估计器。添加了对带有自动分箱估计的范围受限直方图的支持。
np.roll 现在可以同时滚动多个轴#
roll 的 shift 和 axis 参数现在会相互广播,并且每个指定的轴都会相应地进行移位。
为 ndarrays 实现了 __complex__ 方法#
现在,对大小为 1 的数组调用 complex() 将转换为 Python complex。
现在支持 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。
泛型 Ufunc 现在将释放 GIL#
泛型 Ufunc,包括大部分 linalg 模块,现在将释放 Python 全局解释器锁。
np.fft 中的缓存现在受到总大小和项目数量的限制#
np.fft 中用于加速相同长度的连续 FFT 的缓存不再可以无限制地增长。它们已被 LRU(最近最少使用)缓存取代,当达到内存大小或项目数量限制时,这些缓存会自动清除不再需要的项目。
改进了零宽度字符串/Unicode dtypes 的处理#
修复了几个明确禁止使用零宽度字符串 dtype(即 dtype('S0') 或 dtype('U0'))的接口,并修复了几个关于这些 dtype 未正确处理的错误。特别是,更改了 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 的 quicksort 类型现在是 introsort,它是一个常规的 quicksort,但在进展不足时会切换到 heapsort。这保留了 quicksort 的良好性能,同时将最坏情况的运行时间从 O(N^2) 更改为 O(N*log(N))。
ediff1d 改进了性能和子类处理#
ediff1d 函数使用数组而不是平面迭代器进行减法。当 to_begin 或 to_end 不为 None 时,减法会就地执行以消除复制操作。一个副作用是某些子类得到了更好的处理,特别是 astropy.Quantity,因为会创建完整的数组,进行包装,然后设置 begin 和 end 值,而不是使用 concatenate。
提高了 float16 数组的 ndarray.mean 的精度#
float16 数组的均值计算现在以 float32 进行,以提高精度。这对于像 Theano 这样的包很有用,因为 float16 的精度足够,并且其较小的内存占用是可取的。
更改#
fromnumeric.py 中的所有 array-like 方法现在都使用关键字参数调用#
在内部,fromnumeric.py 中的许多 array-like 方法被使用位置参数调用,而不是像它们外部签名那样使用关键字参数。这导致下游的“pandas”库出现了一个复杂问题,该问题遇到了“numpy”兼容性问题。现在,此模块中的所有 array-like 方法都使用关键字参数调用。
对 np.memmap 对象的运算在大多数情况下返回 numpy 数组#
以前,对 memmap 对象的操作会误导性地返回 memmap 实例,即使结果实际上不是 memmapped 的。例如,arr + 1 或 arr + arr 将返回 memmap 实例,尽管输出数组没有 memmapped。版本 1.12 从这些操作返回普通的 NumPy 数组。
此外,对 memmap 的规约(例如 .sum(axis=None)现在返回 NumPy 标量而不是 0d memmap。
stacklevel of warnings increased#
python 中基于警告的 stacklevel 已增加,以便大多数警告将报告用户代码的违规行,而不是警告本身所在的行。现在会测试 stacklevel 的传递,以确保新的警告能够接收 stacklevel 参数。
这会导致“default”或“module”过滤器的警告显示为每次违规的用户代码行或用户模块一次,而不是只显示一次。在 Python 3.4 之前的版本中,这可能会导致之前被错误忽略的警告出现,这可能会令人惊讶,尤其是在测试套件中。