NumPy 1.19.0 版本说明#
此 NumPy 版本着重于清除大量技术债务:移除了对 Python 2 的支持,许多已弃用的功能已过期,并改进了文档。通过 Cython 的错误修复和更好的可用性,对 random 模块的打磨仍在继续。
此版本支持的 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` 中的兼容层将保留,以支持第三方包,但未来版本可能会弃用。请注意,由于使用了 f-strings,1.19.x 将无法与早期 Python 版本编译。
(gh-15233)
已过期的弃用#
numpy.insert 和 numpy.delete 不再接受 0 维数组的 axis 参数#
这结束了 1.9 版本中的一个弃用项。过去,当在 0 维数组上调用 `~numpy.insert` 和 `~numpy.delete` 时传递 `axis` 参数,`axis` 和 `obj` 参数以及索引将被完全忽略。在这种情况下,`insert(arr, "nonsense", 42, axis=0)` 实际上会覆盖整个数组,而 `delete(arr, "nonsense", axis=0)` 会返回 `arr.copy()`。
现在,在 0 维数组上使用 `axis` 参数将引发 `~numpy.AxisError`。
(gh-15802)
numpy.delete 不再忽略超出边界的索引#
这结束了 1.8 和 1.9 版本中的弃用项。过去,`np.delete` 会忽略索引序列中负数和超出边界的项。这与其传递单个索引时的行为不一致。
现在,超出边界的项将引发 `IndexError`,而负数项将从末尾开始索引。
(gh-15804)
numpy.insert 和 numpy.delete 不再接受非整数索引#
这结束了 1.9 版本中的一个弃用项。过去,允许非整数索引序列并将其转换为整数。现在,传递非整数索引序列将引发 `IndexError`,就像传递单个非整数标量一样。
(gh-15805)
numpy.delete 不再将布尔索引转换为整数#
这结束了 1.8 版本中的一个弃用项。过去,`np.delete` 会将布尔数组和标量作为索引参数传递,并将其转换为整数索引。现在的行为是将布尔数组视为掩码,并对布尔标量引发错误。
(gh-15815)
兼容性说明#
更改了 numpy.random.Generator.dirichlet 的随机变量流#
当 `max(alpha) < 0.1` 时,通过使用不同的算法修复了 Dirichlet 分布在 alpha 值较小时生成随机变量的错误。由于此更改,在这种情况下 `dirichlet` 生成的变量流将与先前版本不同。
(gh-14924)
PyArray_ConvertToCommonType 中的标量提升#
PyArray_ConvertToCommonType 中混合标量和数组的提升已更改,以遵循 `np.result_type` 使用的规则。这意味着输入如 `(1000, np.array([1], dtype=np.uint8))` 现在将返回 `uint16` 数据类型。在大多数情况下,行为未改变。请注意,此 C-API 函数的使用通常不被推荐。这也修复了 `np.choose` 在这方面与 NumPy 其他部分的行为一致。
(gh-14933)
fasttake 和 fastputmask 插槽已弃用并置为 NULL#
fasttake 和 fastputmask 插槽现在永远不会被使用,并且必须始终设置为 NULL。这不会导致行为上的任何改变。但是,如果用户自定义类型设置了其中一个,将发出 `DeprecationWarning`。
(gh-14942)
np.ediff1d 与 `to_end` 和 `to_begin` 的转换行为#
np.ediff1d 现在为其额外的 `to_end` 和 `to_begin` 参数使用 `"same_kind"` 转换规则。这确保了类型安全,除非输入数组的整数类型小于 `to_begin` 或 `to_end`。在极少数情况下,行为会比 1.16 和 1.17 版本更严格。这对于解决浮点 NaN 问题是必要的。
(gh-14981)
将空数组状对象转换为 NumPy 数组#
长度为 `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 类型如 `int` 或 `float`)现在将与传递 `np.dtype(arg2).type` 保持一致。这使得结果与预期一致,并在某些以前返回 True 的情况下导致错误结果。
(gh-15773)
更改标量上的 round 输出,以与 Python 一致#
当不带参数调用时,`__round__` dunder 方法以及因此内置的 Python `round` 的输出已更改为 Python `int`,以与调用 Python `float` 对象保持一致。以前,它会返回传递的数据类型的标量。 [`np.dtype`](https://numpy.com.cn/doc/stable/reference/generated/numpy.dtype.html#numpy.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 不再与生成冲突#
以前,小于 `2**96` 的小种子会被隐式地用 0 填充到 128 位(内部熵池的大小)。生成时,生成密钥会连接到 0 填充之前。由于第一个生成密钥是 `(0,)`,因此生成前的小种子会产生与第一个生成的 `SeedSequence` 相同的状态。现在,在连接生成密钥之前,种子会被显式地用 0 填充到内部池大小。生成的 `SeedSequences` 将产生与先前版本不同的结果。未生成的 `SeedSequences` 仍将产生相同的结果。
(gh-16551)
弃用#
弃用对不规则输入自动进行 dtype=object#
根据 [NEP 34](https://numpy.com.cn/neps/nep-0034.html),调用 `np.array([[1, [1, 2, 3]])` 将发出 `DeprecationWarning`。用户应显式使用 `dtype=object` 以避免警告。
(gh-15119)
向 `numpy.rec` 中的工厂函数传递 `shape=0` 已弃用#
`0` 被视为特殊情况,并在函数中别名为 `None`
numpy.core.records.fromarraysnumpy.core.records.fromrecordsnumpy.core.records.fromstringnumpy.core.records.fromfile
未来,`0` 将不再被特殊处理,而是像任何其他整数一样被视为数组长度。
(gh-15217)
弃用可能未使用的 C-API 函数#
以下 C-API 函数可能未使用,已被弃用:
PyArray_GetArrayParamsFromObjectPyUFunc_GenericFunctionPyUFunc_SetUsesArraysAsData
在大多数情况下,`PyArray_GetArrayParamsFromObject` 应替换为转换为数组,而 `PyUFunc_GenericFunction` 可以替换为 `PyObject_Call`(详情请参阅文档)。
(gh-15427)
将某些类型转换为 dtype 已弃用#
标量类型的超类,例如 `np.integer`、`np.generic` 或 `np.inexact`,现在在转换为 dtype(或在 dtype 关键字参数中使用)时会发出弃用警告。原因是 `np.integer` 被转换为 `np.int_`,而它应该表示任何整数(例如,也包括 `int8`、`int16` 等。例如,`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_BroadcastToShapePyArray_IntTupleFromIntpPyArray_OverflowMultiplyList
以前,调用者必须强制移除 const 来调用这些函数。
(gh-15251)
UFunc 内部循环进行 const 限定#
`UFuncGenericFunction` 现在期望 `dimension` 和 `strides` 的 const 指针作为参数。这意味着内部循环不再可以修改 `dimension` 或 `strides`。此更改会导致 `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.copy 的 subok 选项#
向 `numpy.copy` 添加了一个新的关键字参数 `subok`,允许用户切换 `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_nonzero 的 keepdims 参数#
向 `numpy.count_nonzero` 添加了 `keepdims` 参数。该参数的含义与 `numpy.sum` 或 `numpy.mean` 等归约函数中的含义相同。
(gh-15870)
numpy.array_equal 的 equal_nan 参数#
向 `numpy.array_equal` 添加了关键字参数 `equal_nan`。`equal_nan` 是一个布尔值,用于切换 `nan` 值是否在比较中被视为相等(默认为 `False`)。这匹配了相关函数(如 `numpy.isclose` 和 `numpy.allclose`)使用的 API。
(gh-16128)
改进#
改进 CPU 功能检测#
用更通用的函数 `npy_cpu_init` 和 `npy_cpu_have` 替换了 `npy_cpu_supports`(这是一个 GCC 特定的 AVX 支持测试机制),并通过 C 宏 `NPY_CPU_HAVE` 和 Python 级字典 `__cpu_features__` 公开结果。
(gh-13421)
在 64 位平台上,在后备 lapack_lite 中使用 64 位整数大小#
在 64 位平台上,在后备 LAPACK 库(当系统没有安装 LAPACK 时使用)中使用 64 位整数大小,使其能够处理大型数组的线性代数。
(gh-15218)
当输入为 np.float64 时,使用 AVX512 intrinsic 实现 np.exp#
当输入为 `np.float64` 时,使用 AVX512 intrinsic 实现 `np.exp`,这可以使 `np.exp` 与 `np.float64` 输入的性能比以前提高 5-7 倍。在 Linux64 上,`_multiarray_umath.so` 模块增加了约 63 KB。
(gh-15648)
禁用 madvise hugepages 的能力#
在 Linux 上,NumPy 以前添加了对 madavise hugepages 的支持,这可以提高非常大数组的性能。不幸的是,在旧的内核版本上,这会导致性能回归,因此默认情况下,在 4.6 版本之前的内核上已禁用此支持。要覆盖默认值,您可以使用环境变量
NUMPY_MADVISE_HUGEPAGE=0
或将其设置为 1 以强制启用支持。请注意,只有当操作系统设置为使用 madvise 透明 hugepage 时,这才会产生影响。
(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)` 的代码路径和测试。当调用 `ufunc(op)` 或 `ufunc.reduce(op)` 且 `op.__array__` 存在时,它会被激活。然而,该变体并未文档化,并且其使用意图尚不清楚。它已被移除。
(gh-15118)
numpy.random._bit_generator 已移动到 numpy.random.bit_generator#
为了将 `numpy.random.BitGenerator` 和 `numpy.random.SeedSequence` 暴露给 Cython,`_bitgenerator` 模块现已公开为 `numpy.random.bit_generator`。
通过 .pxd 文件提供对随机分布的 Cython 访问#
`c_distributions.pxd` 提供了对许多随机分布背后 C 函数的访问,使其易于从 Cython 使用和扩展。
(gh-15463)
修复了 numpy.random.multivariate_normal 中的 eigh 和 cholesky 方法#
之前,在传递 method='eigh' 或 method='cholesky' 时,numpy.random.multivariate_normal 生成的样本来自错误的分布。现在已修复。
(gh-15872)
修复了 MT19937.jumped 中的跳跃实现#
此修复程序更改了由跳跃的 MT19937 生成器产生的流。它不会影响使用 RandomState 或直接播种的 MT19937 产生的流。
MT19937 的跳跃代码的翻译包含反向的循环顺序。 MT19937.jumped 匹配 Makoto Matsumoto 对 Horner 和滑动窗口跳跃方法的原始实现。
(gh-16153)