NumPy 1.18.0 发布说明#

除了通常的错误修复外,此NumPy版本清理并记录了新的随机C-API,过期了大量旧的弃用,并改进了文档的外观.支持的Python版本为3.5-3.8.这是最后一个支持Python 3.5的NumPy发布系列.

下游开发者应使用 Cython >= 0.29.14 以支持 Python 3.8,并使用 OpenBLAS >= 3.7 以避免 Skylake 架构上的问题.

亮点#

  • numpy.random 的 C-API 已经定义并文档化.

  • 与64位BLAS和LAPACK库链接的基本基础设施.

  • 许多文档改进.

新功能#

多元超几何分布已添加到 numpy.random#

方法 multivariate_hypergeometric 已添加到类 numpy.random.Generator 中.此方法从多元超几何概率分布生成随机变量.(gh-13794)

弃用#

np.fromfilenp.fromstring 在遇到坏数据时会报错#

在未来的 numpy 版本中,函数 np.fromfilenp.fromstring 在解析错误数据时将抛出错误.现在这将给出 DeprecationWarning,而之前会静默返回部分甚至无效的数据.这一弃用也影响 C 定义的函数 PyArray_FromStringPyArray_FromFile (gh-13605)

ma.fill_value 中弃用非标量数组作为填充值#

MaskedArray.fill_value 设置为非标量数组已被弃用,因为将填充值广播到数组的逻辑是脆弱的,尤其是在切片时.(gh-13698)

弃用 PyArray_As1D, PyArray_As2D#

PyArray_As1DPyArray_As2D 已被弃用,请改用 PyArray_AsCArray (gh-14036)

弃用 np.alen#

np.alen 已被弃用.请改用 len.(gh-14181)

弃用财务函数#

根据 NEP-32,财务函数 fv ipmt, irr, mirr, nper, npv, pmt, ppmt, pvrate 已被弃用,并将在 NumPy 1.20 中移除.这些函数的替代品是 Python 包 numpy-financial.(gh-14720)

numpy.ma.mask_colsnumpy.ma.mask_rowaxis 参数已被弃用#

这个参数总是被忽略.(gh-14996)

已过时的弃用#

  • PyArray_As1DPyArray_As2D 已被 PyArray_AsCArray 取代 (gh-14036)

  • np.rank 已被移除.这在 NumPy 1.10 中已被弃用,并被 np.ndim 取代.(gh-14039)

  • 在 1.13.0 版本中 expand_dims 的越界轴弃用已经过期.(gh-14051)

  • PyArray_FromDimsAndDataAndDescrPyArray_FromDims 已被移除(它们将始终引发错误).请改用 PyArray_NewFromDescrPyArray_SimpleNew. (gh-14100)

  • numeric.loads, numeric.load, np.ma.dump, np.ma.dumps, np.ma.load, np.ma.loads 已被移除,请使用 pickle 方法替代 (gh-14256)

  • arrayprint.FloatFormat, arrayprint.LongFloatFormat 已被移除,请使用 FloatingFormat 代替

  • arrayprint.ComplexFormat, arrayprint.LongComplexFormat 已被移除,请使用 ComplexFloatingFormat 代替

  • arrayprint.StructureFormat 已被移除,请使用 StructureVoidFormat 代替 (gh-14259)

  • np.testing.rand 已被移除.这在 NumPy 1.11 中已被弃用,并被 np.random.rand 取代.(gh-14325)

  • numpy/lib/utils.py 中的类 SafeEval 已被移除.这在 NumPy 1.10 中已被弃用.请改用 np.safe_eval.(gh-14335)

  • np.select 中移除对布尔值和空条件列表的弃用支持 (gh-14583)

  • 数组顺序仅接受 ‘C’, ‘F’, ‘A’, 和 ‘K’.更多宽松的选项在 NumPy 1.11 中已被弃用.(gh-14596)

  • np.linspace 参数 num 必须是一个整数.在 NumPy 1.12 中已弃用.(gh-14620)

  • 具有多个输出的 UFuncs 必须使用元组作为 out kwarg.这完成了在 NumPy 1.10 中开始的弃用.(gh-14682)

文件 numpy/testing/decorators.pynumpy/testing/noseclasses.pynumpy/testing/nosetester.py 已被移除.它们从未打算公开(所有相关对象都存在于 numpy.testing 命名空间中),并且从 NumPy 1.15.0 开始导入它们会给出弃用警告 (gh-14567)

兼容性说明#

numpy.lib.recfunctions.drop_fields 不再返回 None#

如果使用 drop_fields 来删除所有字段,以前数组会被完全丢弃并返回 None.现在它返回一个与输入形状相同的数组,但没有字段.可以使用以下方式保留旧行为:

dropped_arr = drop_fields(arr, ['a', 'b'])
if dropped_arr.dtype.names == ():
    dropped_arr = None

将空的 recarray 转换为 None (gh-14510)

numpy.argmin/argmax/min/max 如果在数组中存在 NaT,则返回 NaT#

numpy.argminnumpy.argmaxnumpy.minnumpy.max 如果在数组中存在 NaT,将返回 NaT.(gh-14717)

np.can_cast(np.uint64, np.timedelta64, casting='safe') 现在是 False#

之前这是 True - 然而,这与 uint64 不能安全地转换为 int64 不一致,并导致奇怪的类型解析.

如果这影响了你的代码,请先将 uint64 转换为 int64. (gh-14718)

将随机变量流从 numpy.random.Generator.integers 更改#

numpy.random.Generator.integers 中存在一个错误,导致8位和16位整数类型的采样有偏差.修复该错误已改变了与之前版本相比的输出流.(gh-14777)

datetime64, timedelta64 添加更多的 ufunc 循环#

np.datetime('NaT') 的行为应该更像 float('Nan').添加所需的基础设施,以便 np.isinf(a)np.isnan(a) 可以在 datetime64timedelta64 dtypes 上运行.还为 numpy.fminnumpy.fmax 添加了特定的循环,这些循环会屏蔽 NaT.这可能需要调整面向用户的代码.具体来说,禁止调用 numpy.isinfnumpy.isnan 的代码,或者检查它们是否引发异常的代码将需要适应,错误地调用 numpy.fmaxnumpy.fmin 而不是 numpy.maximumnumpy.minimum 的代码将需要调整.这也会影响 numpy.nanmaxnumpy.nanmin. (gh-14841)

numpy.random 中移动的模块#

作为API清理的一部分,``numpy.random`` 中的子模块 bit_generator, philox, pcg64, sfc64, ``common, generator, 和 bounded_integers 分别被移动到 _bit_generator, _philox, _pcg64, _sfc64, ``_common, _generator, 和 _bounded_integers 以表明它们不是公共接口的一部分.(gh-14608)

C API 变化#

PyDataType_ISUNSIZED(descr) 现在对于结构化数据类型返回 False#

之前,这会对任何数据类型的 itemsize 0 返回 True,但现在这会对 itemsize 0 的非灵活数据类型返回 false,``np.dtype([])``.(gh-14393)

新功能#

添加我们自己的 *.pxd cython 导入文件#

添加了一个 numpy/__init__.pxd 文件.它将用于 cimport numpy (gh-12284)

现在可以将一组轴输入到 expand_dims#

numpy.expand_dimsaxis 关键字现在可以接受一个轴的元组.以前,``axis`` 必须是整数.(gh-14051)

对 64 位 OpenBLAS 的支持#

增加了对64位(ILP64)OpenBLAS的支持.详情请参见 site.cfg.example . (gh-15012)

添加 --f2cmap 选项到 F2PY#

允许指定一个文件来加载 Fortran-to-C 类型映射自定义项.(gh-15113)

改进#

不同C语言数值类型具有相同的大小,但名称唯一.#

在任何给定的平台上,之前 np.intcnp.int_np.longlong 中的两个会通过它们的 repr 看起来无法区分,尽管它们对应的 dtype 具有不同的属性.类似的问题也存在于这些类型的无符号对应物中,并且在某些平台上也存在于 np.doublenp.longdouble 中.

这些类型现在总是以唯一的 __name__ 打印.(gh-10151)

argwhere 现在在 0d 数组上产生一致的结果#

在 N 维数组上,``numpy.argwhere`` 现在总是生成形状为 (n_non_zero, arr.ndim) 的数组,即使在 arr.ndim == 0 的情况下也是如此.以前,在这种情况下,最后一个轴的维度为 1.(gh-13610)

random.permutationrandom.shuffle 添加 axis 参数#

之前,``random.permutation`` 和 random.shuffle 函数只能沿第一个轴对数组进行洗牌;现在它们有了一个新的参数 axis,允许沿指定的轴进行洗牌.(gh-13829)

np.random.multivariate_normalmethod 关键字参数#

method 关键字参数现在可用于 np.random.multivariate_normal,其可能值为 {'svd', 'eigh', 'cholesky'}.要使用它,请写 np.random.multivariate_normal(..., method=<method>).(gh-14197)

numpy.fromstring 添加复数支持#

现在 numpy.fromstring 可以读取复数.(gh-14227)

axis 不是 None 时,``numpy.unique`` 具有一致的轴顺序#

numpy.unique 中使用 moveaxis 而不是 swapaxes ,这样除了参数中的轴之外的轴的顺序不会被破坏.(gh-14255)

numpy.matmul 现在将布尔输出转换为布尔值#

调用 numpy.matmul 时,如果输出是一个布尔数组,则会用结果的 uint8 等价值填充数组,而不是 0/1.现在它强制输出为 0 或 1(NPY_TRUENPY_FALSE).(gh-14464)

当范围为 2**32 时,``numpy.random.randint`` 生成了不正确的值#

在1.17.0版本中引入的实现,在确定是否使用32位路径或完整的64位路径时,有一个错误的检查,错误地将范围为``2**32``的高-低随机整数生成重定向到64位生成器.(gh-14501)

numpy.fromfile 添加复数支持#

现在 numpy.fromfile 可以读取复数.(gh-14730)

如果编译器名为 gcc,则添加 std=c99#

GCC 在版本5之前需要 -std=c99 命令行参数.较新的编译器会自动开启C99模式.编译器设置代码会自动添加代码,如果编译器名称中有 gcc . (gh-14771)

变化#

NaT 现在排序到数组的末尾#

NaT 现在在排序时被有效地视为最大的整数,因此它会排到数组的末尾.这一改变是为了与 NaN 排序行为保持一致.(gh-12658) (gh-15068)

np.set_printoptionsthreshold 不正确会引发 TypeErrorValueError#

之前一个不正确的 threshold 会引发 ValueError;现在对于非数字类型会引发 TypeError,对于 nan 值会引发 ValueError.(gh-13899)

保存带有元数据的 dtype 时发出警告#

当通过 numpy.save 保存带有 metadata 的数组时,会发出一个 UserWarning .保存这样的数组可能不会保留元数据,如果保留了元数据,加载它会导致 ValueError .保存和加载的这一缺陷将在未来的版本中得到解决.(gh-14142)

numpy.distutils 对 LDFLAGS 和类似项的追加行为已更改#

numpy.distutils 总是覆盖而不是追加到 LDFLAGS 和其他类似的用于编译 Fortran 扩展的环境变量.现在默认行为已更改为追加 - 这是大多数情况下的预期行为.要保留旧的(覆盖)行为,请将 NPY_DISTUTILS_APPEND_FLAGS 环境变量设置为 0.这适用于:LDFLAGSF77FLAGSF90FLAGSFREEFLAGSFOPTFDEBUGFFLAGS.NumPy 1.16 和 1.17 在行为更改会影响使用的编译标志的情况下给出了构建警告.(gh-14248)

移除 numpy.random.entropy 而不进行弃用#

numpy.random.entropy 在 1.17.0 版本中被添加到 numpy.random 命名空间.它原本是一个私有的 c-扩展模块,但被公开了.它已被 numpy.random.SeedSequence 取代,因此该模块被完全移除.(gh-14498)

添加选项以静默构建配置并通过 -Werror 构建#

添加了两个新的配置选项.在 build_src 子命令期间,作为配置 NumPy 的一部分,文件 _numpyconfig.hconfig.h 是通过探测各种运行时函数和例程的支持而创建的.以前,这一阶段非常详细的编译器输出掩盖了更重要的信息.默认情况下,输出是静音的.运行 runtests.py --debug-info 将向 build_src 子命令添加 --verbose-cfg,这将恢复之前的行为.

添加 CFLAGS=-Werror 将警告转换为错误会在配置期间触发错误.现在 runtests.py --warn-error 会将 --warn-error 添加到 build 子命令中,这将渗透到 build_extbuild_lib 子命令中.这将为这些阶段添加编译器标志,并在实际构建 NumPy 本身时将编译器警告转换为错误,避免 build_src 子命令的编译器调用.

(gh-14527) (gh-14518)