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`` 中的垫片将保留以支持第三方包,但它们可能在未来的版本中被弃用.请注意,1.19.x 版本将 无法 使用较早版本的 Python 编译,因为使用了 f-字符串.

    (gh-15233)

过时的弃用#

numpy.insertnumpy.delete 不能再在 0d 数组上传递轴#

这结束了从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.insertnumpy.delete 不再接受非整数索引#

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

(gh-15805)

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

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

(gh-15815)

兼容性说明#

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

在生成小 ‘alpha’ 值的 Dirichlet 分布随机变量时的一个错误,通过在 max(alpha) < 0.1 时使用不同的算法得到了修复.由于这一改变,在这种情况下由 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.这将不会改变行为.然而,如果用户 dtype 设置了其中一个,将会给出 DeprecationWarning.

(gh-14942)

np.ediff1dto_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.issubdtype 自 NumPy 1.14 起有一个 FutureWarning,现在已经过期.这意味着某些输入中,第二个参数既不是数据类型也不是 NumPy 标量类型(例如字符串或像 intfloat 这样的 Python 类型)现在将与传入 np.dtype(arg2).type 一致.这使得结果与预期一致,并在某些情况下导致之前返回真值的情况现在返回假值.

(gh-15773)

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

__round__ 魔术方法的输出以及因此 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#

调用 np.array([[1, [1, 2, 3]]) 会根据 NEP 34 发出 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)

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

标量类型的超类,例如 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

之前,调用者必须去掉常量属性才能调用这些函数.

(gh-15251)

Const 限定 UFunc 内部循环#

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

(gh-15355)

新功能#

numpy.frompyfunc 现在接受一个标识参数#

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

(gh-8255)

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

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

(gh-15385)

numpy.copysubok 选项#

一个新的 kwarg,``subok``,被添加到 numpy.copy 中,以允许用户切换 numpy.copy 关于数组子类的行为.默认值是 False,这与之前 numpy 版本的 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)

keepdims 参数用于 numpy.count_nonzero#

参数 keepdims 被添加到 numpy.count_nonzero 中.该参数与 numpy.sumnumpy.mean 等归约函数中的含义相同.

(gh-15870)

equal_nan 参数用于 numpy.array_equal#

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

(gh-16128)

改进#

改进 CPU 特性检测#

将特定于 gcc 的机制 npy_cpu_supports 替换为更通用的函数 npy_cpu_initnpy_cpu_have,并通过 NPY_CPU_HAVE c-宏和 Python 级别的 __cpu_features__ 字典公开结果.

(gh-13421)

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

在备用 LAPACK 库中使用 64 位整数大小在 64 位平台上,当系统没有安装 LAPACK 时使用,允许其处理大型数组的线性代数.

(gh-15218)

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

当输入为 np.float64 时,使用 AVX512 内在函数来实现 np.exp,这可以使 np.expnp.float64 输入时的性能提升 5-7 倍.``_multiarray_umath.so`` 模块在 linux64 上增加了约 63 KB.

(gh-15648)

禁用 madvise 大页面的能力#

在Linux上,NumPy之前增加了对madvise大页面的支持,这可以提高非常大的数组的性能.不幸的是,在旧的内核版本上,这导致了性能退化,因此在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 的标识,允许它在空序列上调用.这匹配了 ~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#

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

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

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)