NumPy 1.20

2021-01-31 20:21:43

此NumPy版本是迄今为止最大的版本,已合并了184个人贡献的684个PR。有关更多详细信息,请参见下面的重点列表。此版本支持的Python版本为3.7-3.9,对Python3.6的支持已删除。重点是

NumPy函数的注释。这项工作正在进行中,可以期待改进,有待用户反馈。

广泛使用SIMD可提高ufuncs的执行速度。在引入通用功能方面已经做了很多工作,这些通用功能可以简化跨不同硬件平台使用现代功能。这项工作正在进行中。

更改dtype和强制转换实现的初步工作,以便为扩展dtype提供更简单的途径。这项工作正在进行中,但是已经做了足够的工作以允许实验和反馈。

包括185个PR合并在内的大量文档改进。这项工作正在进行中,是大型项目的一部分,该项目旨在提高NumPy的在线形象和对新用户的实用性。

新功能与随机播放和置换的不同之处在于,对轴索引的子数组进行置换,而不是对其他索引的每种组合将轴视为单独的一维数组。例如,现在可以置换二维数组的行或列。

numpy.lib.stride_tricks.sliding_window_view在numpyarrays上构造视图,这些视图提供对数组的滑动或移动窗口访问。这允许某些算法的简单实现,例如运行方式。

>>> np。 broadcast_shapes((1,2),(3,1))(3,2)>> np。 broadcast_shapes(2,(3,1))(3,2)> np。 broadcast_shapes((6,7),(5,6,1),(7,),(5,1,7))(5,6,7)

长期以来,np.int一直是内置int的别名。对于新来者来说,这是反复引起混乱的原因,并且主要是出于历史原因。

这些别名已被弃用。下表显示了不赞成使用的别名的完整列表,以及它们的确切含义。将第一列中的项目替换为第二列中的内容将相同地工作,并且将弃用警告静音。

第三列列出了备用NumPy名称,这些名称有时可能会优先。另请参阅数据类型以获取更多详细信息。

为了给大多数情况提供明确的指导,使用普通版本的bool,object,str(和unicode)类型简短明了,通常是一个很好的替代。对于float和complex,可以根据需要使用float64和complex128更精确地说明精度。

对于np.int,直接替换为np.int_或int也是很好的,并且不会更改行为,但是精度将继续取决于计算机和操作系统。如果您想更明确地了解当前用法,请注意以下内容备择方案:

np.int64或np.int32来精确指定精度。这可以确保结果不依赖于计算机或操作系统。

np.int_或int(默认设置),但请注意,它取决于计算机和操作系统。

np.intp在32位计算机上为32位,在64位计算机上为64位,这可能是用于索引的最佳类型。

当与np.dtype(...)或dtype = ...一起使用时,如上所述将其更改为NumPy名称将不会对输出产生任何影响。

更改它可以巧妙地改变结果。在这种情况下,通常最好使用Python版本的float(123)或int(12。),尽管NumPyversion对于与NumPy数组保持一致可能很有用(例如,NumPy对于除以零的行为有不同的表现)。

以前,这是传递shape =()的别名。此弃用由C API中的PyArray_IntpConverter发出。如果yourAPI旨在支持传递None,则应在调用转换器之前检查None,以便能够区分None和()。

将来,即使整数索引的长度为0,当整数数组索引包含超出范围的值时,NumPy也会引发IndexError。这将发出DeprecationWarning。当数组先前为空或为空时,可能会发生这种情况。涉及:

以前没有检查非空索引[20]的正确性。现在将检查非空索引[20]会导致弃用警告,该警告将变为错误。这也适用于作业。

模式和搜索端的不精确和不区分大小写的匹配早先是有效输入,现在将给出DeprecationWarning。例如,下面是一些不推荐使用的示例,现在将提供DeprecationWarning:

将numpy导入为np arr = np。数组([[[3,6,6],[4,5,1]])#模式:不完全匹配np。 ravel_multi_index(arr,(7,6),mode =" clap")#应该是" clip" #searchside:不完全匹配np。 searchsorted(arr [0],4,side =' random')#应该是" right"

numpy.dual模块已弃用。不应从numpy.dual导入函数,而应直接从NumPyor SciPy导入函数。

np.matrix与外部或通用ufunc外部调用(例如numpy.add.outer)一起使用。以前,矩阵在这里转换为数组。将来将不需要手动转换为数组来完成此操作。

其余的数字样式类型代码Bytes0,Str0,Uint32,Uint64和Datetime64已被弃用。应该使用小写字母的变体。对于字节和字符串" S"和" U"是其他选择。

自NumPy 1.8起,文档已警告不要使用此函数,请使用next(it)代替it.ndincr()。

定义协议__array__,__array_interface__或__array_struct__之一但不是序列(通常由__len__和__getitem__定义)的对象将来在数组强制期间的行为会有所不同。

当嵌套在序列中时,例如np.array([array_like]),它们将作为单个Python对象而不是数组进行处理。将来,它们的行为将与以下行为相同:

仅当np.array(array_like)不是0-D时此更改才有效。此警告的解决方案可能取决于该对象:

某些类似数组的对象可能会期待新的行为,并且用户可以忽略警告。对象可以选择公开序列协议以选择加入新的行为。

例如,shape将允许使用line.coords而不是np.asarray(line)转换为类似数组的形式。用户可以解决该警告,也可以使用新的约定。

如果希望确保旧的行为保持不变,请创建一个对象数组,然后显式填充它,例如:

这将确保NumPy知道不会输入类似数组的内容,而是将其用作对象。

当dtype是子数组dtype(例如np.dtype("(2)i,"))时,使用np.array(arr,dtype)和arr.astype(dtype)创建和转换数组将使用不同的逻辑。

会使用错误的广播(通常会导致错误)。将来,它将改为分别投射每个元素,从而导致与以下结果相同的结果:

除非列表本身包含至少一个数组,否则此更改不会影响np.array(list,dtype ="(2)i,")。特别是,对于元组列表,行为不变。

数字样式类型代码np.dtype(" Complex64")(使用大写拼写)的弃用已过期。 " Complex64"对应于" complex128"和" Complex32"对应于" complex64"。

np.sctypeNA和np.typeNA的弃用已过期。两者都已从公共API中删除。请改用np.typeDict。

根据NEP 32,财务功能已从NumPy 1.20中删除。已删除的功能为fv,ipmt,irr,mirr,nper,npv,pmt,ppmt,pv和rate。这些函数在numpy_financiallibrary中可用。

NumPy dtype不再是np.dtype的直接实例。可能使用type(dtype)为np.dtype的代码将始终返回False,并且必须进行更新以使用正确的版本isinstance(dtype,np.dtype)。

如果是针对早于1.16.6的NumPy进行编译,则此更改还会影响C端宏PyArray_DescrCheck。如果代码使用此宏并希望针对较旧版本的NumPy进行编译,则必须替换该宏(另请参见C API更改部分)。

当使用axis = None调用串联时,以不安全的方式强制转换了扁平数组。其他任何选择都使用“相同种类”。不建议使用其他默认值,而将使用“相同”类型的强制转换。新的强制转换关键字参数可以用于保留旧的行为。

在创建或分配给数组时,在所有相关情况下,NumPyscalars现在都将与NumPy数组完全相同。特别是在某些情况下,这会改变以前引起错误的行为:

将成功并返回不确定的结果(通常是最小的整数)。这也会影响分配:

保持不受影响(np.nan是Python浮点数,而不是NumPy浮点数)。与有符号整数不同,无符号整数不会保留这种特殊情况,因为它们的行为更像是强制转换。以下代码停止引发错误:

为了避免向后兼容问题,目前支持从datetime64标量到长度太短的字符串的分配。这意味着np.asarray(np.datetime64(" 2020-10-10"),dtype =& #34; S5")现在成功了,之前它失败了。从长远来看,这可能会被弃用,或者通常可以允许进行不安全的强制转换,以使数组和标量的分配行为一致。

结果将发生变化,在某些情况下,这可能导致具有更长字符串的字符串dtypes。特别是,如果dtype =" S"未提供任何数值将导致字符串结果足够长的时间以容纳所有可能的数值。 (例如,浮点数为“ S32”)。请注意,您应始终提供dtype =" S"将非字符串转换为字符串时。

如果dtype =" S"前提是结果与以前基本相同,但是NumPy标量(不是像1.0这样的Python浮点数)仍将强制使用统一的字符串长度:

数组强制已进行了重组。通常,这不应影响用户。在极少数情况下,嵌套类似数组的情况:

这可能会微妙地更改某些定义不正确的数组对象的输出。一个例子是数组对象,它们也不是形状匹配的序列。在NumPy 1.20中,当数组对象也没有顺序时会发出警告(但是行为仍然相同,请参见弃用)。如果like这样的数组也是一个序列(定义__getitem__和__len __),NumPy现在将仅使用__array__,__array_interface__或__array_struct__给出的结果。当(嵌套)序列描述不同的形状时,这将导致差异。

在NumPy 1.17中,将结果数组写入时,numpy.broadcast_arrays开始发出警告。通过缓冲区接口(例如memoryview(arr))使用阵列时,将跳过此警告。对于这两个协议__array_interface__和__array_struct__返回只读缓冲区而不给出警告,现在将发生相同的事情。

以前的行为是退回到加法并添加两个数组,这被认为是串联函数的意外行为。

以前,如果使用unpack = True调用numpy.genfromtxt并将其传递给dtype参数(或者传递dtype = None并推断出结构化数据类型),则无法解压缩。

>>> data = StringIO(" 21 58.0 \ n 35 72.0")>> np。 genfromtxt(data,dtype = None,unpack = True)array([(21,58.),(35,72.)],dtype = [[' f0&#39 ;,'< i8& #39;),(&#39f1','< f8')])

以前,np.mgrid [np.float32(0.1):np.float32(0.35):np.float32(0.1),]和np.r_ [0:10:np.complex64(3j)]无法返回有意义的输出。当使用除默认float64和complex128以外的dtype输入以及等效的Python类型时,此错误可能会影响mgrid,ogrid,r_和c_,此方法已修复,可以正确处理各种精度。

以前,如果布尔数组索引与索引数组的大小匹配但与形状不匹配,则在某些情况下会错误地允许它。在其他情况下,它给出了一个错误,但该错误是错误的ValueError并带有有关广播的消息,而不是正确的IndexError。

例如,以下用于错误地给出ValueError的值:操作数不能与形状(2,2)(1,4)一起广播:

两者现在都正确给出IndexError:布尔索引与维度0上的索引数组不匹配;维为2,但对应的布尔维为1。

在强制转换值时进行迭代时,错误可能会比以前更早地停止迭代。无论如何,失败的铸造操作总是返回不确定的部分结果。对于NpyIter C-API的用户而言,此类转换错误现在将导致iternext()函数返回0并因此中止迭代。当前,没有API可直接检测到此类错误。检查PyErr_Occurred(),与NpyIter_Reset结合使用可能会出现问题。这些问题始终存在,但是如果用户需要,可以添加新的API。

以前由f2py生成的代码返回的某些字节字符串现在可能是unicodestrings。这是由于正在进行的Python2-> Python3清理。

这个接口已经被记录了很多年,但是仍然有一些代码可以接受指针地址的字节字符串表示形式,但是该代码已被删除,将地址作为字节字符串传递会引发错误。

以前,构造一个全零系数的poly1d实例会将系数转换为np.float64,这会影响内部构造poly1d实例的方法的输出dtype,例如np.polymul。

Python 2.7 C-API函数的使用已更新为仅Python 3。需要旧版本的用户应从旧版本的NumPy中获取它。

在使用np.array(...,dtype =" V"),arr.astype(" V")和类似方法的调用中,除非分配元素具有相同的空隙长度。例如:

从针对较早版本编译的NumPy 1.20代码开始的API将与NumPy 1.20不兼容。修复方法是针对1.16.6进行编译(如果NumPy 1.16版本是您希望支持的最旧版本),或者通过手动替换来内联宏它具有新的定义:

PyArrayObject和PyVoidScalarObject结构的大小已更改。以下标头定义已删除:

因为不能将大小视为编译时间常数:它将针对NumPy的不同运行时版本而改变。

最可能相关的用途是用C编写的潜在子类,这些子类必须重新编译并应进行更新。请参阅PyArrayObject的文档以获取更多详细信息,如果您受到此更改的影响,请与NumPy开发人员联系。

NumPy将尝试给出适当的错误,但是期望固定结构大小的程序可能具有未定义的行为并可能崩溃。

添加关键字参数where,仅允许在all和any的布尔评估中考虑数组中的指定元素或子轴。此新关键字可直接通过numpy或在numpy.ndarray的方法中用于所有函数。

任何可广播的布尔数组或标量都可以设置为where。如果用户未设置where,则默认为True以评估数组中所有元素的功能。功能文档中提供了示例。

添加关键字参数where,并允许将均值,std和var的计算范围限制为仅元素子集。它可以直接通过numpy或在numpy.ndarray的方法中使用。

任何可广播的布尔数组或标量都可以设置为where。如果用户未设置where,则默认为True以评估数组中所有元素的功能。功能文档中提供了示例。

关键字参数选项norm = backward被添加为None的别名,并充当默认选项;使用它具有未缩放的直接变换和按1 / n缩放的逆变换。

使用新的关键字参数选项norm = forward将DirectTransforms缩放为1 / n,将逆变换缩放为未缩放(即与默认选项norm = backward相反)。

类型注释已为NumPy的大部分添加。还有一个新的numpy.typing模块,其中包含有用的最终用户类型。当前可用的类型是

这两个选项都有些不方便,因此请在运行测试中添加--mypy选项,以便为您进行设置。将来,这对于任何键入代码源也将很有用,因为它将确保在类型检查之前就已构建项目。

distutils允许在确定BLAS / LAPACK库时否定库,这可用于从库解析阶段删除一项,即禁止NetLIB库执行以下操作:

使用--bench-compareargument时,现在可以将-j,--cpu-baseline,--cpu-dispatch和--disable-optimization标志传递给ASV构建。

dtype选项现在可用于numpy.cov和numpy.corrcoef,它指定返回结果应具有的数据类型。默认情况下,函数仍返回numpy.float64结果。

numpy.polynomial中所有六个多项式类型的字符串表示形式(__str__)已更新,可以将多项式作为数学表达式而不是系数数组。多项式表达式的两种包范围格式均可用-一种对上标和下标使用Unicode字符,另一种仅使用ASCII字符。

如果对象数组的元素的repr包含换行,则换行的行将按列对齐。值得注意的是,这改善了嵌套数组的重复性:

>>> np。数组([np。eye(2),np。eye(3)],dtype = object)array([array([[[1。,0.],[0.,1.]]),array([[ 1.,0.,0.],[0.,1.,0.],[0.,0.,1.]]))],dtype = object)

添加了支持以连接以提供输出dtype和使用关键字参数的转换。不能与out类型一起提供dtype参数。

在numpy.distutils.fcompiler中更改了Fortran Portland Group Compiler的编译器命令选择。这仅影响链接命令。这将强制使用命令行选项(如果提供)提供的可执行文件,而不是pgfortran可执行文件。如果没有为命令行选项提供可执行文件,则默认为pgf90可执行文件,根据PGI文档,这是pgfortran的别名。

Cython 3.0的pxd声明已得到改进,以避免使用不推荐使用的NumPy C-API功能。现在,使用NumPy用Cython 3.0+构建的扩展模块可以设置C宏NPY_NO_DEPRECATED_API = NPY_1_7_API_VERSION以避免C编译器有关已弃用API的警告。

确保NumPy提供的窗口函数是对称的。由于数值精度,以前与对称性之间的偏差很小,现在可以通过更好地安排计算来避免。

NumPy基础设施的一系列改进为NEP-38铺平了道路,可以总结如下:

--cpu-baseline指定最小的必需优化集,默认值为min,它提供可以安全地在各种用户平台上运行的最少CPU功能。

--cpu-dispatch指定其他优化的调度集,默认值为max -xop -fma4

......