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.insert 和 numpy.delete 不能再传递给 0d 数组的轴#
这结束了从 1.9 开始的弃用,其中当将 axis 参数传递给对 0d 数组的 ~numpy.insert 和 ~numpy.delete 的调用时, 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 开始的弃用,其中 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 时使用不同的算法,修复了具有小"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_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 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 类型,如 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 设置为 () 的预期含义,而后者继续导致自动选择 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.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 )
将某些类型转换为 dtypes 已被弃用#
标量类型的超类,例如 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 )
弃用 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_BroadcastToShapePyArray_IntTupleFromIntpPyArray_OverflowMultiplyList
以前,调用者必须强制转换掉常量性才能调用这些函数.
( gh-15251 )
常量限定 UFunc 内部循环#
UFuncGenericFunction 现在需要指向常量 dimension 和 strides 的指针作为参数.这意味着内部循环可能不再修改 dimension 或 strides .此更改会导致 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.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 参数#
参数 keepdims 已添加到 numpy.count_nonzero 中.该参数与归约函数(例如 numpy.sum 或 numpy.mean )中的含义相同.
( gh-15870 )
numpy.array_equal 的 equal_nan 参数#
关键字参数 equal_nan 已添加到 numpy.array_equal 中. equal_nan 是一个布尔值,用于切换在比较中是否将 nan 值视为相等(默认为 False ).这与相关函数(例如 numpy.isclose 和 numpy.allclose )中使用的 API 匹配.
( gh-16128 )
改进#
改进 CPU 功能的检测#
使用更通用的函数 npy_cpu_init 和 npy_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.exp 与 np.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.BitGenerator 和 numpy.random.SeedSequence , _bitgenerator 模块现在作为 numpy.random.bit_generator 公开
通过 pxd 文件提供对随机分布的 Cython 访问#
c_distributions.pxd 提供了从 Cython 访问许多随机分布背后的 c 函数的途径,使其方便使用和扩展.
( 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 )