NumPy 1.19.0 发行说明#

此 NumPy 版本的标志是移除了许多技术债务:已删除对 Python 2 的支持,许多弃用已过期,并且文档已得到改进. 随机模块的改进仍在继续,包括错误修复和来自 Cython 的更好可用性.

此版本支持的 Python 版本是 3.6-3.8.下游开发人员应使用 Cython >= 0.29.16 以获得 Python 3.8 支持,并使用 OpenBLAS >= 3.7 以避免 Skylake 架构上的问题.

亮点#

  • 从 Python 和 C 代码中都删除了与 Python 版本 < 3.6(包括 Python 2)的代码兼容性. numpy.compat 中的 shims 将保留以支持第三方软件包,但它们可能会在以后的版本中被弃用.请注意,由于使用了 f-strings,1.19.x 将无法使用早期版本的 Python 编译.

    ( gh-15233 )

过期的弃用#

numpy.insertnumpy.delete 不能再传递给 0d 数组的轴#

这结束了从 1.9 开始的弃用,其中当将 axis 参数传递给对 0d 数组的 ~numpy.insert~numpy.delete 的调用时, axisobj 参数以及索引将被完全忽略.在这些情况下, insert(arr, "nonsense", 42, axis=0) 实际上会覆盖整个数组,而 delete(arr, "nonsense", axis=0) 将是 arr.copy()

现在在 0d 数组上传递 axis 会引发 ~numpy.AxisError .

( gh-15802 )

numpy.delete 不再忽略越界索引#

这结束了从 1.8 和 1.9 开始的弃用,其中 np.delete 会忽略索引序列中的负数和越界项目.这与其在传递单个索引时的行为不一致.

现在越界项抛出 IndexError ,负项从末尾索引.

( gh-15804 )

numpy.insertnumpy.delete 不再接受非整数索引#

这结束了从 1.9 开始的弃用,其中允许非整数索引序列并将其转换为整数.现在传递非整数索引序列会引发 IndexError ,就像传递单个非整数标量时一样.

( gh-15805 )

numpy.delete 不再将布尔索引转换为整数#

这结束了从 1.8 开始的弃用,其中 np.delete 会将作为索引参数传递的布尔数组和标量转换为整数索引.现在的行为是将布尔数组视为掩码,并在布尔标量上引发错误.

( gh-15815 )

兼容性说明#

numpy.random.Generator.dirichlet 更改随机变量流#

通过在 max(alpha) < 0.1 时使用不同的算法,修复了具有小"alpha"值的 Dirichlet 分布的随机变量生成中的错误. 由于此更改,在这种情况下由 dirichlet 生成的变量流将与以前的版本不同.

( gh-14924 )

PyArray_ConvertToCommonType 中的标量提升#

PyArray_ConvertToCommonType 中混合标量和数组的提升已更改为遵守 np.result_type 使用的那些. 这意味着诸如 (1000, np.array([1], dtype=np.uint8))) 之类的输入现在将返回 uint16 dtypes. 在大多数情况下,行为没有改变. 请注意,通常不鼓励使用此 C-API 函数. 这也修复了 np.choose 在这方面与 NumPy 的其余部分表现相同的问题.

( gh-14933 )

Fasttake and fastputmask 插槽已弃用并设为 NULL#

fasttake 和 fastputmask 插槽现在永远不会被使用,并且必须始终设置为 NULL.这将不会导致行为上的改变.然而,如果用户 dtype 设置了其中一个,将会发出 DeprecationWarning.

( gh-14942 )

np.ediff1d 在使用 to_endto_begin 时的类型转换行为#

np.ediff1d 现在对其附加的 to_endto_begin 参数使用 "same_kind" 转换规则.这确保了类型安全,除非输入数组具有比 to_beginto_end 更小的整数类型.在极少数情况下,此行为将比之前的 1.16 和 1.17 版本更严格.这是解决浮点数 NaN 问题的必要措施.

( gh-14981 )

将空类数组对象转换为 NumPy 数组#

具有 len(obj) == 0 且实现了"类数组"接口的对象,即实现了 obj.__array__() , obj.__array_interface__ , obj.__array_struct__ 或 python buffer 接口并且也是序列(即 Pandas 对象)的对象,现在在转换为数组时将始终正确地保留其形状.如果此类对象之前的形状为 (0, 1) ,则可能会转换为形状为 (0,) 的数组(失去第一个 0 之后的所有维度).

( gh-14995 )

移除 multiarray.int_asbuffer#

作为持续移除 Python 2 兼容性的一部分,移除了 multiarray.int_asbuffer .在 Python 3 上,它会抛出一个 NotImplementedError 并且在内部未使用.预计 Python 3 没有针对此方法的下游用例.

( gh-15229 )

numpy.distutils.compat 已被移除#

该模块仅包含函数 get_exception() ,其使用方式如下:

try:
    ...
except Exception:
    e = get_exception()

它的目的是处理 Python 2.6 中引入的语法更改,从 except Exception, e: 变为 except Exception as e: ,这意味着它仅对于支持 Python 2.5 及更早版本的代码库是必需的.

( gh-15255 )

issubdtype 不再将 float 解释为 np.floating#

自 NumPy 1.14 以来, numpy.issubdtype 有一个 FutureWarning,现在已过期.这意味着某些输入(其中第二个参数既不是数据类型也不是 NumPy 标量类型,例如字符串或 Python 类型,如 intfloat )现在将与传入 np.dtype(arg2).type 的结果一致.这使得结果与预期一致,并在某些先前返回 true 的情况下导致错误的结果.

( gh-15773 )

更改标量上 round 的输出以与 Python 保持一致#

__round__ dunder 方法(以及 Python 内置函数 round )的输出已更改为 Python int ,以便在不带参数调用时与在 Python float 对象上调用它时保持一致.以前,它会返回一个传入 np.dtype 的标量.

( gh-15840 )

numpy.ndarray 构造函数不再将 strides=() 解释为 strides=None#

前者已更改为具有将 numpy.ndarray.strides 设置为 () 的预期含义,而后者继续导致自动选择 strides.

( gh-15882 )

C 级别字符串到日期时间类型的转换已更改#

简化了 C 级别的字符串转换.此更改还修复了字符串到日期时间和 timedelta 类型的转换,使其行为正确(即,像使用 string_arr.astype("M8") 的 Python 转换一样),而以前的转换行为类似于 string_arr.astype(np.int_).astype("M8") .这仅影响使用低级 C-API 来手动转换单个标量值或使用例如 PyArray_GetCastFunc 的代码(不是完整的数组转换),因此不应影响绝大多数用户.

( gh-16068 )

小种子的 SeedSequence 不再与生成冲突#

小的种子(小于 296 )以前会被隐式地用 0 填充到 128 位,即内部熵池的大小.当生成时,生成密钥会在 0 填充之前连接.由于第一个生成密钥是 (0,) ,在生成之前的的小种子会创建与第一个生成的 SeedSequence 相同的状态.现在,种子在连接生成密钥之前,会显式地用 0 填充到内部池大小.生成的 SeedSequences 将产生与之前版本不同的结果.未生成的 SeedSequences 仍将产生相同的结果.

( gh-16551 )

弃用#

弃用对参差不齐的输入自动设置 dtype=object#

调用 np.array([[1, [1, 2, 3]]) 将按照 NEP 34 发出 DeprecationWarning .用户应显式使用 dtype=object 以避免警告.

( gh-15119 )

shape=0 传递给 numpy.rec 中的工厂函数已被弃用#

0 被视为一个特殊情况,并在以下函数中别名为 None :

  • numpy.core.records.fromarrays

  • numpy.core.records.fromrecords

  • numpy.core.records.fromstring

  • numpy.core.records.fromfile

将来, 0 将不会被特殊处理,而是像任何其他整数一样被视为数组长度.

( gh-15217 )

弃用可能未使用的 C-API 函数#

以下 C-API 函数可能未使用,并且已被弃用:

  • PyArray_GetArrayParamsFromObject

  • PyUFunc_GenericFunction

  • PyUFunc_SetUsesArraysAsData

在大多数情况下, PyArray_GetArrayParamsFromObject 应该替换为转换为数组,而 PyUFunc_GenericFunction 可以替换为 PyObject_Call (有关详细信息,请参见文档).

( gh-15427 )

将某些类型转换为 dtypes 已被弃用#

标量类型的超类,例如 np.integer , np.genericnp.inexact ,现在在转换为 dtype(或在 dtype 关键字参数中使用)时会给出弃用警告.原因是 np.integer 被转换为 np.int_ ,而它应该表示任何整数(例如,也包括 int8 , int16 等).例如, dtype=np.floating 当前与 dtype=np.float64 相同,即使 np.float32 也是 np.floating 的子类.

( gh-15534 )

弃用 round 用于 np.complexfloating 标量#

__round__ dunder 方法以及 Python 内置 round 的输出已在复数标量上被弃用.这不会影响 np.round .

( gh-15840 )

numpy.ndarray.tostring() 赞成使用 tobytes() ,已被弃用#

~numpy.ndarray.tobytes 自 1.9 版本以来就已存在,但在此版本之前, ~numpy.ndarray.tostring 没有发出任何警告.发出警告的更改使 NumPy 与同名的内置 array.array 方法保持一致.

( gh-15867 )

C API 变更#

更好地支持 API 函数中的 const 维度#

以下函数现在接受 npy_intp 的常量数组:

  • PyArray_BroadcastToShape

  • PyArray_IntTupleFromIntp

  • PyArray_OverflowMultiplyList

以前,调用者必须强制转换掉常量性才能调用这些函数.

( gh-15251 )

常量限定 UFunc 内部循环#

UFuncGenericFunction 现在需要指向常量 dimensionstrides 的指针作为参数.这意味着内部循环可能不再修改 dimensionstrides .此更改会导致 incompatible-pointer-types 警告,迫使用户要么忽略编译器警告,要么常量限定他们自己的循环签名.

( gh-15355 )

新特性#

numpy.frompyfunc 现在接受 identity 参数#

这允许在生成的 ufunc 上设置 numpy.ufunc.identity 属性,这意味着它可以用于对 numpy.ufunc.reduce 的空调用和多维调用.

( gh-8255 )

np.str_ 标量现在支持缓冲区协议#

np.str_ 数组总是以 UCS4 格式存储,因此相应的标量现在通过缓冲区接口暴露这一点,这意味着 memoryview(np.str_('test')) 现在可以正常工作.

( gh-15385 )

numpy.copysubok 选项#

一个新的关键字参数 subok 被添加到 numpy.copy 中,允许用户切换 numpy.copy 在数组子类方面的行为.默认值为 False ,这与先前 numpy 版本的 numpy.copy 的行为一致.要创建一个保留数组子类的 numpy.copy 副本,请调用 np.copy(arr, subok=True) .此添加更好地说明了 numpy.copy 的默认行为与默认情况下尊重数组子类的 numpy.ndarray.copy 方法不同.

( gh-15685 )

numpy.linalg.multi_dot 现在接受 out 参数#

out 可用于避免创建由 numpy.linalg.multidot 计算的最终产品的非必要副本.

( gh-15715 )

numpy.count_nonzerokeepdims 参数#

参数 keepdims 已添加到 numpy.count_nonzero 中.该参数与归约函数(例如 numpy.sumnumpy.mean )中的含义相同.

( gh-15870 )

numpy.array_equalequal_nan 参数#

关键字参数 equal_nan 已添加到 numpy.array_equal 中. equal_nan 是一个布尔值,用于切换在比较中是否将 nan 值视为相等(默认为 False ).这与相关函数(例如 numpy.isclosenumpy.allclose )中使用的 API 匹配.

( gh-16128 )

改进#

改进 CPU 功能的检测#

使用更通用的函数 npy_cpu_initnpy_cpu_have 替换了 npy_cpu_supports ,后者是 gcc 特定的用于测试 AVX 支持的机制,并通过 NPY_CPU_HAVE c-macro 以及 python 级别的 __cpu_features__ 字典公开了结果.

( gh-13421 )

在回退 lapack_lite 中,在 64 位平台上使用 64 位整数大小#

在回退 LAPACK 库中,在 64 位平台上使用 64 位整数大小.当系统未安装 LAPACK 时,将使用该库,从而允许它处理大型数组的线性代数.

( gh-15218 )

当输入为 np.float64 时,使用 AVX512 intrinsic 实现 np.exp#

当输入为 np.float64 时,使用 AVX512 intrinsic 实现 np.exp ,这可以使 np.expnp.float64 输入的性能提高比以前快 5-7 倍. _multiarray_umath.so 模块在 linux64 上增长了大约 63 KB.

( gh-15648 )

禁用 madvise 巨页的能力#

在 Linux 上,NumPy 之前已添加对 madavise 巨页的支持,这可以提高非常大的数组的性能.不幸的是,在较旧的内核版本上,这导致了性能下降,因此默认情况下,在 4.6 之前的内核版本上已禁用对该特性的支持.要覆盖默认值,可以使用环境变量:

NUMPY_MADVISE_HUGEPAGE=0

或者将其设置为 1 以强制启用支持.请注意,这仅当操作系统设置为使用 madvise 透明巨页时才会有所不同.

( gh-15769 )

numpy.einsum 在下标列表中接受 NumPy int64 类型#

numpy.einsum 被传递一个 NumPy int64 数组作为其下标列表时,不再抛出类型错误.

( gh-16080 )

np.logaddexp2.identity 更改为 -inf#

ufunc ~numpy.logaddexp2 现在具有 -inf 的 identity,允许在空序列上调用它.这与 ~numpy.logaddexp 的 identity 匹配.

( gh-16102 )

变更#

删除对 __array__ 的额外参数的处理#

自 NumPy 0.4 以来,代码路径和测试一直存在于代码中,用于 __array__(dtype=None, context=None) 的双参数变体.如果存在 op.__array__ ,则在调用 ufunc(op)ufunc.reduce(op) 时会激活它.但是,该变体未记录,并且不清楚其使用的意图.它已被删除.

( gh-15118 )

numpy.random._bit_generator 移动到 numpy.random.bit_generator#

为了向 Cython 公开 numpy.random.BitGeneratornumpy.random.SeedSequence , _bitgenerator 模块现在作为 numpy.random.bit_generator 公开

通过 pxd 文件提供对随机分布的 Cython 访问#

c_distributions.pxd 提供了从 Cython 访问许多随机分布背后的 c 函数的途径,使其方便使用和扩展.

( gh-15463 )

修复了 numpy.random.multivariate_normal 中的 eighcholesky 方法#

以前,当传递 method='eigh'method='cholesky' 时, numpy.random.multivariate_normal 会生成来自错误分布的样本.现在已修复.

( gh-15872 )

修复了 MT19937.jumped 中的跳转实现#

此修复程序更改了从跳转的 MT19937 生成器生成的流.它不影响使用直接播种的 RandomStateMT19937 生成的流.

MT19937 的跳转代码的转换包含一个反向的循环排序. MT19937.jumped 匹配 Makoto Matsumoto 的 Horner 和滑动窗口跳转方法的原始实现.

( gh-16153 )