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_FromFilegh-13605

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

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

废弃 PyArray_As1D, PyArray_As2D#

PyArray_As1D, PyArray_As2D 已废弃,请改用 PyArray_AsCArraygh-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_AsCArraygh-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 已移除,请改用 StructureVoidFormatgh-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

  • 具有多个输出的 UFunc 必须使用元组作为 out 关键字参数。这完成了 NumPy 1.10 中开始的废弃。(gh-14682

文件 numpy/testing/decorators.py, numpy/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_generatorphiloxpcg64sfc64, ``commongeneratorbounded_integers 已分别移动到 _bit_generator_philox_pcg64_sfc64, ``_common_generator_bounded_integers,以表明它们不属于公共接口。(gh-14608

C API 更改#

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

以前,它对任何 itemsize 为 0 的数据类型返回 True,但现在它对 itemsize 为 0 的非灵活数据类型 np.dtype([]) 返回 False。(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

向 F2PY 添加 --f2cmap 选项#

允许指定一个文件以从中加载 Fortran 到 C 类型映射的自定义设置。(gh-15113

改进#

相同大小的不同 C 数字类型具有唯一的名称#

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

这些类型现在始终以唯一的 __name__ 打印。(gh-10151

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

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

random.permutationrandom.shuffle 添加 axis 参数#

以前 random.permutationrandom.shuffle 函数只能沿第一个轴打乱数组;它们现在有了一个新参数 axis,允许沿指定的轴打乱。(gh-13829

np.random.multivariate_normalmethod 关键字参数#

np.random.multivariate_normal 现在有一个 method 关键字参数,可能的值为 {'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#

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

变更#

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

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

np.set_printoptions 中不正确的 threshold 会引发 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。这适用于:LDFLAGS, F77FLAGS, F90FLAGS, FREEFLAGS, FOPT, FDEBUG, 和 FFLAGS。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 将向 build 子命令添加 --warn-error,这会渗透到 build_extbuild_lib 子命令。这将在这些阶段添加编译器标志,并将编译器警告转换为错误,同时实际构建 NumPy 本身,避免 build_src 子命令的编译器调用。

gh-14527)(gh-14518