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_As1D, PyArray_As2D 已弃用,请使用 PyArray_AsCArray 代替 (gh-14036)

弃用 np.alen#

np.alen 已弃用。请使用 len 代替。(gh-14181)

弃用财务函数#

根据 NEP-32,财务函数 fv ipmt, irr, mirr, nper, npv, pmt, ppmt, pv and rate 已弃用,并将从 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)

  • NumPy 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 关键字参数使用元组。这完成了 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.argmin, numpy.argmax, numpy.min, and numpy.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 数据类型上运行。还为 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, and bounded_integers 已分别移动到 _bit_generator, _philox, _pcg64, _sfc64, _common, _generator, and _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.intc, np.int_, and 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.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)

numpy.uniqueaxis 不为 None 时具有一致的轴顺序#

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

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

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

numpy.random.randint 在范围为 2**32 时产生了错误的值#

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 时发出警告#

当使用 metadata 通过 numpy.save 保存数组时,将发出 UserWarning。保存此类数组可能不会保留元数据,如果元数据被保留,加载它将导致 ValueError。此 save 和 load 的不足之处将在未来的版本中得到解决。(gh-14142)

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

numpy.distutils 过去一直覆盖而非追加 LDFLAGS 和其他类似的编译 Fortran 扩展的环境变量。现在默认行为已更改为追加 - 这在大多数情况下是预期的行为。要保留旧的(覆盖)行为,请将 NPY_DISTUTILS_APPEND_FLAGS 环境变量设置为 0。这适用于:LDFLAGS, F77FLAGS, F90FLAGS, FREEFLAGS, FOPT, FDEBUG, and FFLAGS。NumPy 1.16 和 1.17 在此行为变更可能影响所用编译标志的情况下发出了构建警告。(gh-14248)

在没有弃用的情况下移除 numpy.random.entropy#

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

添加选项以静默构建配置和使用 -Werror 进行构建#

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

CFLAGS=-Werror 添加到以将警告视为错误会触发配置期间的错误。现在 runtests.py --warn-error 会将 --warn-error 添加到 build 子命令中,该选项会传递给 build_extbuild_lib 子命令。这会将编译器标志添加到这些阶段,并在实际构建 NumPy 本身时将编译器警告视为错误,从而避免 build_src 子命令的编译器调用。

(gh-14527) (gh-14518)