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.insert
和 numpy.delete
无法再向 0d 数组传递轴#
这是从 1.9 开始的弃用结束,在 1.9 中,当向对 0d 数组的 ~numpy.insert
和 ~numpy.delete
调用传递 axis
参数时,axis
和 obj
参数和索引将被完全忽略。在这些情况下,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.insert
和 numpy.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_end
和 to_begin
的转换行为#
np.ediff1d
现在对附加的 to_end
和 to_begin
参数使用 "same_kind"
转换规则。这确保了类型安全,除非输入数组的整数类型小于 to_begin
或 to_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 类型,如 int
或 float
)现在将与传入 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.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_BroadcastToShape
PyArray_IntTupleFromIntp
PyArray_OverflowMultiplyList
以前,调用者必须取消 const 性才能调用这些函数。
(gh-15251)
Const 限定 UFunc 内部循环#
UFuncGenericFunction
现在期望指向 const dimension
和 strides
的指针作为参数。这意味着内部循环可能不再修改 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
选项#
新增了一个关键字参数 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_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 功能检测#
将特定于 GCC 的用于测试 AVX 支持的机制 npy_cpu_supports
替换为更通用的函数 npy_cpu_init
和 npy_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.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)