Numpy 1.15.0发行说明

numpy 1.15.0是一个版本,具有异常数量的清理、许多旧函数的弃用以及许多现有函数的改进。请阅读下面的详细描述,看看您是否受到影响。

对于测试,我们已经切换到Pytest来代替不再维护的鼻框架。旧的基于鼻的接口仍然用于可能仍在使用它的下游项目。

此版本支持的Python版本是2.7、3.4-3.7。轮子与openblas v0.3.0相连,它可以修复numpy 1.14报告的一些linalg问题。

集锦

  • numpy已切换到pytest进行测试。

  • 一个新的 numpy.printoptions 上下文管理器。

  • 柱状图函数的许多改进。

  • 在python 2.7中支持unicode字段名。

  • 改进了对Pypy的支持。

  • 修复和改进 numpy.einsum .

新功能

  • numpy.gcdnumpy.lcm ,计算最大公因数和最小公倍数。

  • numpy.ma.stack , the numpy.stack 一般化为屏蔽数组的数组联接函数。

  • numpy.quantile 函数,接口 percentile 不含100因子

  • numpy.nanquantile 函数,接口 nanpercentile 不含100因子

  • numpy.printoptions ,一个上下文管理器,临时为 with 块::

    >>> with np.printoptions(precision=2):
    ...     print(np.array([2.0]) / 3)
    [0.67]
    
  • numpy.histogram_bin_edges ,一个函数,用于获取柱状图使用的箱边缘,而不需要计算柱状图。

  • C函数 npy_get_floatstatus_barriernpy_clear_floatstatus_barrier 已添加以处理更改操作顺序的编译器优化。详情见下文。

贬抑

  • 内置的别名 pickle 函数被弃用,取而代之的是不负责任的 pickle.<func> 姓名:

    • numpy.loads

    • numpy.core.numeric.load

    • numpy.core.numeric.loads

    • numpy.ma.loads, numpy.ma.dumps

    • numpy.ma.loadnumpy.ma.dump -当用字符串调用python 3时,这些函数已经失败。

  • 不推荐使用除元组之外的任何多维索引。这意味着 ind = [slice(None), 0]; arr[ind] 应更改为元组,例如, ind = [slice(None), 0]; arr[tuple(ind)]arr[(slice(None), 0)] . 为了避免表达式中的歧义,如 arr[[[0, 1], [0, 1]]] ,当前解释为 arr[array([0, 1]), array([0, 1])] ,这将被解释为 arr[array([[0, 1], [0, 1]])] 未来。

  • 不推荐从以下子模块导入,将来将删除这些子模块。

    • numpy.testing.utils

    • numpy.testing.decorators

    • numpy.testing.nosetester

    • numpy.testing.noseclasses

    • numpy.core.umath_tests

  • 给发电机 numpy.sum 现已弃用。这是无证行为,但有效。在此之前,它将计算生成器表达式的和。将来,它可能会返回不同的结果。使用 np.sum(np.from_iter(generator)) 或者内置的python sum 相反。

  • C-API的用户应该调用 PyArrayResolveWriteBackIfCopyPyArray_DiscardWritbackIfCopy 在任何具有 WRITEBACKIFCOPY 在取消分配数组之前设置标志。如果不在需要时使用这些调用,将发出拒绝警告。

  • 用户 nditer 只要迭代器操作数中有一个是可写的,就应该将nditer对象用作上下文管理器,以便numpy可以管理写回语义,或者应该调用 it.close() . 一 RuntimeWarning 在这些情况下,可能会以其他方式排放。

  • 这个 normed 的参数 np.histogram ,很久以前在1.6.0中被弃用,现在发出 DeprecationWarning .

未来变化

  • numpy 1.16将放弃对python 3.4的支持。

  • numpy 1.17将放弃对python 2.7的支持。

兼容性说明

已编译的测试模块已重命名并成为私有模块

以下已编译模块已重命名并成为私有模块:

  • umath_tests -> _umath_tests

  • test_rational -> _rational_tests

  • multiarray_tests -> _multiarray_tests

  • struct_ufunc_test -> _struct_ufunc_tests

  • operand_flag_tests -> _operand_flag_tests

这个 umath_tests 模块仍然可以向后兼容,但将来会被删除。

这个 NpzFile 返回的 np.savez 现在是 collections.abc.Mapping

这意味着它的行为就像一个只读字典,并且有一个新的 .values() 方法及 len() 实施。

对于python 3,这意味着 .iteritems().iterkeys() 已被否决,以及 .keys().items() 现在返回视图而不是列表。这与内置的 dict 类型在python 2和python 3之间更改。

在某些条件下, nditer 必须在上下文管理器中使用

当使用 numpy.nditer"writeonly""readwrite" 标记,在某些情况下,nditer实际上没有为您提供可写数组的视图。相反,它会给您一个副本,如果您对副本进行了更改,nditer稍后会将这些更改写回您的实际数组。目前,当数组对象被垃圾收集时,就会发生这种写回操作,这使得这个API错误在cpython上很容易发生,而在pypy上则完全被破坏。因此, nditer 现在应在与可写数组一起使用时用作上下文管理器,例如, with np.nditer(...) as it: ... . 你也可以直接打电话 it.close() 对于上下文管理器不可用的情况,例如在生成器表达式中。

numpy已经改用pytest而不是nose进行测试。

上一次鼻释放是2015年6月的1.3.7,该工具的开发已经结束,因此numpy现在已经转向使用pytest。一些下游项目以前使用的旧装饰器和鼻工具仍然可用,但不会得到维护。标准测试工具, assert_almost_equal 这样,除了鼻子特定的功能外,不会受到这种变化的影响。 import_noseraises . 这些函数不在numpy中使用,而是为下游兼容性而保留。

NumPy 不再猴子补丁 ctypes 具有 __array_interface__

以前添加了numpy __array_interface__ 所有整数类型的属性 ctypes .

np.ma.notmasked_contiguousnp.ma.flatnotmasked_contiguous 始终返回列表

这是文档化的行为,但以前的结果可能是slice、none或list中的任何一个。

所有下游用户似乎都在检查 None 从结果 flatnotmasked_contiguous 换成 [] . 这些呼叫者将像以前一样继续工作。

np.squeeze 恢复无法处理的对象的旧行为 axis 论点

版本之前 1.7.0numpy.squeeze 没有一个 axis 默认情况下,参数和所有空轴都被删除。合并 axis 参数使得有选择地挤压单个或多个空轴成为可能,但是旧的API期望没有得到满足,因为仍然可以有选择地从期望删除所有空轴的对象中删除轴(无声成功)。对于期望旧行为的对象,可以无提示、选择性地删除空轴,这已得到修复,并且恢复了旧行为。

非结构化void数组 .item 方法现在返回一个bytes对象

.item 现在返回 bytes 对象,而不是缓冲区或字节数组。这可能会影响假定返回值是可变的代码,这种情况已不再如此。

copy.copycopy.deepcopy 不再转动 masked 成数组

自从 np.ma.masked 是只读标量,复制应为非操作。这些函数现在的行为与 np.copy() .

结构化数组的多字段索引仍将返回一个副本

结构化数组的多字段索引返回视图而不是副本的更改被推回到1.16。一种新方法 numpy.lib.recfunctions.repack_fields 已经被介绍来帮助减轻这种变化的影响,它可以用来编写与numpy 1.15和1.16兼容的代码。有关如何将代码更新为将来更改的帐户的详细信息,请参阅 user guide _.

C API更改

新功能 npy_get_floatstatus_barriernpy_clear_floatstatus_barrier

功能 npy_get_floatstatus_barriernpy_clear_floatstatus_barrier 已添加,应用于替代 npy_get_floatstatusnpy_clear_status 功能。优化编译器(如gcc 8.1和clang)正在重新排列操作顺序,因为在ufunc simd函数中使用了以前的函数,从而在运行我们要检查其状态的操作之前检查floatstatus标志。见 #10339 _.

改变到 PyArray_GetDTypeTransferFunction

PyArray_GetDTypeTransferFunction now defaults to using user-defined copyswapn / copyswap for user-defined dtypes. If this causes a significant performance hit, consider implementing copyswapn to reflect the implementation of PyArray_GetStridedCopyFn. See #10898 .

新特点

np.gcdnp.lcm 为integer和objects类型添加了ufuncs

它们分别计算最大公因数和最小公倍数。这些工作在所有numpy整数类型上,以及内置的任意精度上。 Decimallong 类型。

支持iOS跨平台构建

已修改生成系统以添加对 _PYTHON_HOST_PLATFORM 环境变量,由使用 distutils 在一个平台上为另一个平台编译时。这使得为iOS目标编译numpy成为可能。

这只允许您一次为一个特定的平台编译numpy。创建一个完整的与iOS兼容的numpy包需要为iOS支持的5个体系结构(i386、x86_64、armv7、armv7s和arm64)构建,并将这5个编译的构建产品组合成一个“胖”二进制文件。

return_indices keyword added for np.intersect1d

新关键词 return_indices 返回与公共元素对应的两个输入数组的索引。

np.quantile and np.nanquantile

喜欢 np.percentilenp.nanpercentile 但接受分位数 [0, 1] 而不是百分位数 [0, 100] . np.percentile 现在是一个薄包装 np.quantile 加上除以100的步骤。

构建系统

增加了对64位RISC-V体系结构的实验支持。

改进

np.einsum 更新

同步einsum路径优化技术 numpyopt_einsum . 尤其是, greedy @jcmgray对path进行了许多增强。已修复问题的完整列表包括:

  • 任意内存可以传递到 greedy 路径。修正GH-11210。

  • 贪婪的路径已经被更新为包含更多的动态编程思想,以防止大量重复(而且代价高昂)调用,从而找出发生的实际对收缩。现在需要对几百个输入张量进行几秒钟的运算。对矩阵产品状态理论有用。

  • 将在GH-11218 GH-10352中发现的广播点错误捕获重新处理为在此过程中稍早一点。

  • 增强了 can_dot 以前错过了边缘案例的功能(GH-11308的一部分)。

np.flip 可以在多个轴上操作

np.flip 现在在它的 axis 参数。如果轴为“无”,它将翻转所有轴。

histogram and histogramdd functions have moved to np.lib.histograms

最初发现于 np.lib.function_base . 它们在它们的无范围内仍然可用 np.histogram(dd) 名称并保持兼容性,别名为 np.lib.function_base.histogram(dd) .

代码执行 from np.lib.function_base import * 将需要更新新位置,并且应考虑不使用 import * 将来。

histogram 在给定显式容器时接受NaN值

以前,当试图计算数据的有限范围时,它会失败。由于在显式给定存储箱时忽略了范围,因此此错误是不必要的。

注意呼叫 histogram 关于NaN值继续提高 RuntimeWarning S通常使用NaN值,可以像通常一样使用 errstate .

histogram 在给定显式bin边缘时,对datetime类型有效

日期、时间和时间增量现在可以用柱状图表示。垃圾箱边缘必须显式传递,并且尚未自动计算。

histogram “自动”估计更好地处理有限方差

0的IQR不再导致 n_bins=1 ,而在这种情况下,选择的存储箱数量与数据大小有关。

边缘重新调整 histogram ‘和 histogramdd 现在匹配数据浮点类型

通过时 np.float16np.float32np.longdouble 数据,返回的边现在是相同的数据类型。以前, histogram 仅当给定显式容器时返回相同的类型,并且 histogram 会产生 float64 不管输入什么,箱子都是。

histogramdd 允许在轴的子集中给定显式范围

这个 range 的参数 numpy.histogramdd 现在可以容纳 None 值指示应根据数据计算相应轴的范围。以前,不能以每轴为基础指定此项。

规范的论点 histogramddhistogram2d 已重命名

现在调用这些参数 density ,这与 histogram . 旧参数继续工作,但应首选新名称。

np.r_ works with 0d arrays, and np.ma.mr_ works with np.ma.masked

0d个数组传递给 r_mr_ 连接助手现在被视为长度为1的数组。以前,传递这些是一个错误。因此, numpy.ma.mr_ 现在可以在 masked 常数。

np.ptp 接受一 keepdims 参数和扩展轴元组

np.ptp (峰对峰)现在可以在多个轴上工作,就像 np.maxnp.min .

MaskedArray.astype now is identical to ndarray.astype

这意味着它采用了所有相同的参数,使得为ndarray编写的更多代码也适用于屏蔽数组。

编译时启用avx2/avx512

更改为simd.inc.src以允许在编译时使用avx2或avx512。以前用-march=native编译avx2(或512)时,即使其他代码得到avx2,也会为simd函数使用sse代码。

nan_to_num 接收标量或0d输入时始终返回标量

以前,为整数标量输入返回了一个数组,这与float输入和ufunc的行为不一致。对于所有类型的标量或0d输入,结果现在是一个标量。

np.flatnonzero 适用于numpy可转换类型

np.flatnonzero 现在使用 np.ravel(a) 而不是 a.ravel() 因此它适用于列表、元组等。

np.interp 返回numpy scalars而不是内置scalar

以前 np.interp(0.5, [0, 1], [10, 20]) 将返回 float ,但现在它返回 np.float64 对象,它更接近于其他函数的行为。

另外,特殊情况 np.interp(object_array_0d, ...) 不再支持,因为 np.interp(object_array_nd) 反正也不支持。

由于这一变化, period 参数现在可以用于0d数组。

在python 2中允许dtype字段名为unicode

以前 np.dtype([(u'name', float)]) 会提高 TypeError 在Python2中,因为字段名中只允许使用字节字符串。现在,任何Unicode字符串字段名都将使用 ascii 编解码器,引发 UnicodeEncodeError 失败后。

这种更改使得使用 from __future__ import unicode_literals 这将导致字符串文本字段名在python 2中引发类型错误。

比较UFUNCS接受 dtype=object ,覆盖默认值 bool

这允许符号类型的对象数组,这些对象数组将覆盖 == 以及返回表达式的其他运算符,以便与 np.equal(a, b, dtype=object) .

sort functions accept kind='stable'

到目前为止,要对数据执行稳定的排序,用户必须执行以下操作:

>>> np.sort([5, 2, 6, 2, 1], kind='mergesort')
[1, 2, 2, 5, 6]

因为合并排序是numpy中唯一可用的稳定排序算法。但是,拥有kind='mergesort'并不能明确表示用户希望执行稳定的排序,从而损害可读性。

此更改允许用户指定kind='stable',从而澄清意图。

不要为就地积累制作临时副本

当UFunc执行累加时,由于输入和输出之间的重叠,它们不再进行临时复制,也就是说,在将累加的结果存储到位之前,会添加下一个累积的元素,因此重叠是安全的。避免复制会加快执行速度。

linalg.matrix_power 现在可以处理矩阵堆栈

和其他功能一样 linalgmatrix_power 现在可以处理尺寸大于2的数组,这些数组被视为矩阵的堆栈。作为更改的一部分,为了进一步提高一致性,第一个参数的名称已更改为 a (从 M ,非方形矩阵的例外情况已更改为 LinAlgError (从 ValueError

提高性能 random.permutation 对于多维数组

permutation 使用快速通道 random.shuffle 对于所有输入数组维度。以前,快速路径仅用于一维数组。

通用UFUNC现在接受 axesaxiskeepdims 参数

可以通过传入 axes 参数,具有特定轴索引的元组列表。例如,对于签名 (i,j),(j,k)->(i,k) 适用于矩阵乘法,基元素是二维矩阵,它们被视为存储在每个参数的最后两个轴中。相应的axs关键字将是 [(-2, -1), (-2, -1), (-2, -1)] . 如果要使用前导尺寸,可以传入 [(0, 1), (0, 1), (0, 1)] .

为简单起见,对于在一维数组(向量)上操作的广义UFunc,接受单个整数而不是单个元素元组,对于所有输出都是标量的广义UFunc,可以省略(空)输出元组。因此,为了签署 (i),(i)->() 适合内部产品,可以通过 axes=[0, 0] 指示向量存储在两个输入参数的第一个维度中。

作为与约简相似的广义UFunc的一个捷径,即作用于一个单一的、共享的核心维度(如上面的内部产品示例),可以通过 axis 参数。这相当于传球 axes 对于具有该核心维度的所有参数(例如,上面的示例, axes=[(axis,), (axis,)]

此外,和约简一样,对于具有相同核心维度数的输入和不具有核心维度的输出的通用UFunc,可以传入 keepdims 在输出中保留尺寸为1的尺寸,从而允许对原始输入进行适当的广播。额外尺寸的位置可通过 axes . 例如,对于内部产品示例, keepdims=True, axes=[-2, -2, -2] 将根据内部产品示例进行操作, keepdims=True, axis=-2 将作用于输入参数的最后一个维度,并在输出中的该位置保留大小为1的维度。

现在在PPC系统上正确打印float128值

以前在PPC上打印float128值是错误的,因为这些系统上的特殊双双浮点格式没有考虑在内。float128s现在以正确的舍入和唯一性进行打印。

向PPC用户发出警告:如果glibc版本<=2.23,则应升级它,特别是使用float128时。在PPC上,这些版本中glibc的malloc经常会不对齐分配的内存,当使用float128值时,这些内存可能会崩溃。

新的 np.take_along_axisnp.put_along_axis 功能

当用于多维数组时, argsortargminargmaxargpartition 返回难以用作索引的数组。 take_along_axis 提供一种使用这些索引在数组中查找值的简单方法,以便:

np.take_along_axis(a, np.argsort(a, axis=axis), axis=axis)

与以下内容相同:

np.sort(a, axis=axis)

np.put_along_axis 作为在数组中写入这些索引的双重操作。