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

    (gh-15233)

已过期的弃用#

numpy.insertnumpy.delete 无法再向 0d 数组传递轴#

这是从 1.9 开始的弃用结束,在 1.9 中,当向对 0d 数组的 ~numpy.insert~numpy.delete 调用传递 axis 参数时,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 开始的弃用结束,在 1.8 和 1.9 中,np.delete 将忽略索引序列中的负数和越界项。这与传递单个索引时的行为不符。

现在,越界项将抛出 IndexError,负数项将从末尾索引。

(gh-15804)

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

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

(gh-15805)

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

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

(gh-15815)

兼容性说明#

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

通过在 max(alpha) < 0.1 时使用不同的算法,修复了使用较小的“alpha”值生成狄利克雷分布的随机变量的错误。由于此更改,在这种情况下由 dirichlet 生成的变量流将与以前的版本不同。

(gh-14924)

PyArray_ConvertToCommonType 中的标量提升#

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

(gh-14933)

fasttake 和 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 缓冲区接口并且也是序列(例如 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 设置为 () 的预期含义,而后者继续导致步幅自动选择。

(gh-15882)

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

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

(gh-16068)

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

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

(gh-16551)

弃用#

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

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

(gh-15119)

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

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)

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

标量类型的超类,例如 np.integernp.genericnp.inexact,现在在转换为 dtype(或在 dtype 关键字参数中使用)时将发出弃用警告。原因是 np.integer 转换为 np.int_,而预期它表示 *任何* 整数(例如 int8int16 等)。例如,dtype=np.floating 目前与 dtype=np.float64 相同,即使 np.float32 也是 np.floating 的子类。

(gh-15534)

弃用 np.complexfloating 标量的 round#

__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

以前,调用者必须取消 const 性才能调用这些函数。

(gh-15251)

Const 限定 UFunc 内部循环#

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

(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 选项#

新增了一个关键字参数 suboknumpy.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 参数#

已向 numpy.count_nonzero 添加了 keepdims 参数。此参数的含义与 numpy.sumnumpy.mean 等约简函数中的含义相同。

(gh-15870)

numpy.array_equalequal_nan 参数#

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

(gh-16128)

改进#

改进 CPU 功能检测#

将特定于 GCC 的用于测试 AVX 支持的机制 npy_cpu_supports 替换为更通用的函数 npy_cpu_initnpy_cpu_have,并通过 NPY_CPU_HAVE C 宏以及 Python 级别的 __cpu_features__ 字典公开结果。

(gh-13421)

在备用 lapack_lite 中使用 64 位整数大小(在 64 位平台上)#

在系统未安装 LAPACK 时使用的备用 LAPACK 库中使用 64 位整数大小(在 64 位平台上),允许它处理大型数组的线性代数。

(gh-15218)

使用 AVX512 内在函数实现 np.exp(当输入为 np.float64 时)#

使用 AVX512 内在函数实现 np.exp(当输入为 np.float64 时),这可以提高 np.exp 的性能,其速度比以前快 5-7 倍。_multiarray_umath.so 模块在 linux64 上增加了大约 63 KB。

(gh-15648)

能够禁用 madvise hugepages#

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

NUMPY_MADVISE_HUGEPAGE=0

或将其设置为 1 以强制启用支持。请注意,只有在操作系统设置为使用 madvise 透明巨页时,这才会产生影响。

(gh-15769)

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

将 NumPy int64 数组作为下标列表传递给 numpy.einsum 时,不再会引发类型错误。

(gh-16080)

np.logaddexp2.identity 已更改为 -inf#

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

(gh-16102)

更改#

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

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

(gh-15118)

numpy.random._bit_generator 已移至 numpy.random.bit_generator#

为了将 numpy.random.BitGeneratornumpy.random.SeedSequence 公开给 Cython,_bitgenerator 模块现在以 numpy.random.bit_generator 的形式公开。

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

c_distributions.pxd 提供对许多随机分布背后的 C 函数的 Cython 访问,使其易于使用和扩展。

(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)