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 )
已过期的弃用#
不再能将轴传递给 0d 数组上的 numpy.insert 和 numpy.delete#
这结束了 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 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 为 () 的预期含义,而后者继续导致自动选择 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#
根据 NEP 34 ,调用 np.array([[1, [1, 2, 3]]) 将发出 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 选项#
向 numpy.copy 添加了一个新的 kwarg 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 参数#
参数 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 ,后者是测试 AVX 支持的 gcc 特定机制,并通过 NPY_CPU_HAVE c-macro 以及 python 级别的 __cpu_features__ 字典公开结果.
( gh-13421 )
在回退的 lapack_lite 中,在 64 位平台上使用 64 位整数大小#
在回退的 LAPACK 库中,在 64 位平台上使用 64 位整数大小.当系统未安装 LAPACK 时会使用此库,使其能够处理大型数组的线性代数.
( gh-15218 )
使用 AVX512 intrinsic 实现 np.exp ,当输入为 np.float64 时#
使用 AVX512 intrinsic 实现 np.exp ,当输入为 np.float64 时,这可以将 np.exp 的性能提高到比以前快 5-7 倍. _multiarray_umath.so 模块在 linux64 上增长了约 63 KB.
( gh-15648 )
禁用 madvise hugepage 的能力#
在 Linux 上,NumPy 之前添加了对 madavise hugepage 的支持,这可以提高非常大的数组的性能.不幸的是,在较旧的内核版本上,这导致了性能下降,因此默认情况下,在 4.6 之前的内核版本上已禁用该支持.要覆盖默认值,您可以使用环境变量:
NUMPY_MADVISE_HUGEPAGE=0
或将其设置为 1 以强制启用支持.请注意,只有在操作系统设置为使用 madvise transparent 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 提供了对 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 )