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.fromfile 和 np.fromstring 将在出现错误数据时报错#
在未来的 numpy 版本中,函数 np.fromfile 和 np.fromstring 在解析错误数据时将抛出一个错误.现在,如果之前静默返回部分甚至无效数据,这将给出一个 DeprecationWarning .这种弃用也会影响 C 定义的函数 PyArray_FromString 和 PyArray_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 和 rate 已被弃用,并将从 NumPy 1.20 中移除.这些函数的替代品是 Python 包 numpy-financial .( gh-14720 )
numpy.ma.mask_cols 和 numpy.ma.mask_row 的 axis 参数已被弃用#
此参数始终被忽略.( gh-14996 )
已过期的弃用#
PyArray_As1D和PyArray_As2D已被删除,推荐使用PyArray_AsCArray( gh-14036 )np.rank已被删除.这在 NumPy 1.10 中已被弃用,并已替换为np.ndim.( gh-14039 )对 1.13.0 中
expand_dims的范围外轴的弃用已过期.( gh-14051 )PyArray_FromDimsAndDataAndDescr和PyArray_FromDims已被删除(它们将始终引发错误).请改用PyArray_NewFromDescr和PyArray_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 必须使用元组作为
outkwarg.这完成了 NumPy 1.10 中开始的弃用. ( gh-14682 )
文件 numpy/testing/decorators.py , numpy/testing/noseclasses.py 和 numpy/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.min 和 numpy.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) 将在 datetime64 和 timedelta64 dtype 上运行.还为 numpy.fmin 和 numpy.fmax 添加了特定的循环,这些循环屏蔽了 NaT .这可能需要调整面向用户的代码.具体来说,禁止调用 numpy.isinf 或 numpy.isnan 或检查它们是否引发异常的代码需要进行调整,而错误地调用 numpy.fmax 和 numpy.fmin 而不是 numpy.maximum 或 numpy.minimum 的代码也需要进行调整.这也影响 numpy.nanmax 和 numpy.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_dims 的 axis 关键字现在可以接受一个轴的元组.以前, 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.double 和 np.longdouble ,存在类似的问题.
这些类型现在总是使用唯一的 __name__ 打印.( gh-10151 )
argwhere 现在在 0d 数组上产生一致的结果#
在 N-d 数组上,即使 arr.ndim == 0 , numpy.argwhere 现在总是产生一个形状为 (n_non_zero, arr.ndim) 的数组. 以前,在这种情况下,最后一个轴的维度为 1.( gh-13610 )
为 random.permutation 和 random.shuffle 添加 axis 参数#
之前, random.permutation 和 random.shuffle 函数只能沿第一个轴 shuffle 数组; 它们现在有一个新的参数 axis ,允许沿指定的轴 shuffle.( gh-13829 )
np.random.multivariate_normal 的 method 关键字参数#
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_TRUE 或 NPY_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 会引发 TypeError 或 ValueError#
以前,不正确的 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.h 和 config.h 是通过探测对各种运行时函数和例程的支持来创建的. 以前,此阶段中非常冗长的编译器输出掩盖了更重要的信息. 默认情况下,输出被禁止. 运行 runtests.py --debug-info 会将 --verbose-cfg 添加到 build_src 子命令,这将恢复以前的行为.
添加 CFLAGS=-Werror 将会把警告转换为错误,从而在配置期间触发错误.现在 runtests.py --warn-error 会添加 --warn-error 到 build 子命令,这个子命令会将该选项传递给 build_ext 和 build_lib 子命令.这将会把编译器标志添加到那些阶段,并且在实际构建 NumPy 自身时,将编译器警告转换为错误,从而避免 build_src 子命令的编译器调用.