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 , 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.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 )

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

如果数组中存在 NaT , numpy.argmin , numpy.argmax , numpy.minnumpy.max 将返回 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 dtype 上运行.还为 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#

以前,这对于任何项目大小为 0 的数据类型都返回 True,但现在这对于项目大小为 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_np.longlong 中的两个之前通过它们的 repr 看起来无法区分,尽管它们对应的 dtype 具有不同的属性. 对于这些类型的无符号对应类型,以及在某些平台上对于 np.doublenp.longdouble ,存在类似的问题.

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

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

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

random.permutationrandom.shuffle 添加 axis 参数#

之前, random.permutationrandom.shuffle 函数只能沿第一个轴 shuffle 数组; 它们现在有一个新的参数 axis ,允许沿指定的轴 shuffle.( 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 )

当范围为 232 时, numpy.random.randint 产生错误的值#

在 1.17.0 中引入的实现在确定是使用 32 位路径还是完整的 64 位路径时存在不正确的检查,该检查错误地将高位和低位范围为 232 的随机整数生成重定向到 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 , FDEBUGFFLAGS . 在 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 会将 --verbose-cfg 添加到 build_src 子命令,这将恢复以前的行为.

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

( gh-14527 ) ( gh-14518 )