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.insert
和 numpy.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.insert
和 numpy.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.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.issubdtype
自 NumPy 1.14 起有一个 FutureWarning,现在已经过期.这意味着某些输入中,第二个参数既不是数据类型也不是 NumPy 标量类型(例如字符串或像 int
或 float
这样的 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.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
之前,调用者必须去掉常量属性才能调用这些函数.
(gh-15251)
Const 限定 UFunc 内部循环#
UFuncGenericFunction
现在期望指向常量 dimension
和 strides
的指针作为参数.这意味着内部循环可能不再修改 dimension
或 strides
.这一变化导致 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.copy
的 subok
选项#
一个新的 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.sum
或 numpy.mean
等归约函数中的含义相同.
(gh-15870)
equal_nan
参数用于 numpy.array_equal
#
关键字参数 equal_nan
被添加到 numpy.array_equal
中.``equal_nan`` 是一个布尔值,用于切换在比较中是否认为 nan
值相等(默认是 False
).这与 numpy.isclose
和 numpy.allclose
等相关函数中使用的 API 相匹配.
(gh-16128)
改进#
改进 CPU 特性检测#
将特定于 gcc 的机制 npy_cpu_supports
替换为更通用的函数 npy_cpu_init
和 npy_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.exp
在 np.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.BitGenerator
和 numpy.random.SeedSequence
,``_bitgenerator`` 模块现在作为 numpy.random.bit_generator
公开
Cython 对随机分布的访问是通过一个 pxd
文件提供的.#
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)