NumPy 1.20.0发行说明

这次NumPy发布是迄今为止最大的一次,有182人参与的648份PRs已经被合并。更多细节请参见下面的亮点列表。此版本支持的Python版本是3.7-3.9,对python3.6的支持已被取消。亮点是

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

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

  • 更改数据类型和强制转换实现的准备工作,以便为扩展数据类型提供更简单的途径。这项工作正在进行中,但已经做了足够的实验和反馈。

  • 广泛的文档改进包括185个PR合并。这项工作正在进行中,是一个更大的项目的一部分,以提高NumPy的在线存在和有用的新用户。

  • 与删除python2.7相关的进一步清理。这提高了代码的可读性并消除了技术负担。

  • 对即将推出的cython3.0的初步支持。

新功能

这个随机发生器班上有一个新的 permuted 功能。

新功能不同于 shufflepermutation 对于其他索引的每个组合,由轴索引的子阵列被排列,而不是将轴作为单独的一维数组。例如,现在可以排列二维数组的行或列。

(gh-15121 ()

sliding_window_view 为numpy阵列提供滑动窗口视图

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

(gh-17394 ()

numpy.broadcast_shapes 是一个新的面向用户的函数

broadcast_shapes 获取通过相互广播给定形状元组得到的形状。

>>> 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)

(gh-17535 ()

贬抑

使用内置类型的别名,如 np.int 被贬低

很久以来, np.int 已成为内置的别名 int . 这是一个反复引起新来者困惑的原因,也是根本没有用的。

这些别名已被弃用。下表显示了不推荐使用的别名的完整列表及其确切含义。用第二列的内容替换第一列中的项的用法将起相同的作用,并使弃用警告静音。

在许多情况下,可能打算使用第三列中的类型。请注意,使用这些类型可能会导致微妙但令人满意的行为变化。

不推荐的名称

相同的

可能是想要的numpy类型

numpy.bool

bool

numpy.bool_

numpy.int

int

numpy.int_ (默认int dtype), numpy.cint (三) int

numpy.float

float

numpy.float_numpy.double (等效)

numpy.complex

complex

numpy.complex_numpy.cdouble (等效)

numpy.object

object

numpy.object_

numpy.str

str

numpy.str_

numpy.long

int (long on Python 2)

numpy.int_ (三) longnumpy.longlong (最大整数类型)

numpy.unicode

str (unicode on Python 2)

numpy.unicode_

请注意,由于技术原因,这些弃用警告将仅在Python3.7及更高版本上发出。

(gh-14882 ()

经过 shape=None 不推荐使用带有非可选形状参数的to函数

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

(gh-15886 ()

即使索引结果为空,也会报告索引错误

将来,当整数数组索引包含越界值时,即使未索引维度的长度为0,NumPy也会引发IndexError。现在将发出一个弃用警告。当数组以前为空或涉及空片时,可能会发生这种情况:

arr1 = np.zeros((5, 0))
arr1[[20]]
arr2 = np.zeros((5, 5))
arr2[[20], :0]

以前是非空索引 [20] 未检查其正确性。现在将对其进行检查,从而导致一个弃用警告,该警告将变成一个错误。这也适用于作业。

(gh-15900 ()

不精确匹配 modesearchside 已弃用

不精确且不区分大小写的匹配 modesearchside 以前是有效的输入,现在将发出弃用警告。例如,下面是一些现在已弃用的示例用法,它们将给出弃用警告:

import numpy as np
arr = np.array([[3, 6, 6], [4, 5, 1]])
# mode: inexact match
np.ravel_multi_index(arr, (7, 6), mode="clap")  # should be "clip"
# searchside: inexact match
np.searchsorted(arr[0], 4, side='random')  # should be "right"

(gh-16056 ()

贬低 numpy.dual

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

(gh-16156 ()

outerufunc.outer 不推荐用于矩阵

np.matrix 与一起使用 outer 或通用的ufunc外部调用,例如 numpy.add.outer . 在此之前,矩阵被转换为数组。这在将来不需要手动转换为阵列。

(gh-16232 ()

其他数值样式类型已弃用

其余的数字样式类型代码 Bytes0Str0Uint32Uint64Datetime64 已经被否决了。应改用小写形式。对于字节和字符串 "S""U" 还有更多的选择。

(gh-16554 ()

这个 ndincr 方法 ndindex 被贬低

从numpy1.8开始,文档就警告不要使用此函数。使用 next(it) 而不是 it.ndincr() .

(gh-17233 ()

不定义 __len____getitem__

定义其中一个协议的对象 __array____array_interface____array_struct__ 但不是序列(通常通过 __len____getitem__ )在将来的数组强制期间将有不同的行为。

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

np.array([np.array(array_like)])

这种改变只有在 np.array(array_like) 不是0-D。此警告的解决方案可能取决于对象:

  • 一些类似数组的人可能会期望出现新的行为,用户可以忽略警告。对象可以选择公开序列协议以选择加入新行为。

  • 例如, shapely 将允许转换为数组,如使用 line.coords 而不是 np.asarray(line) . 用户可以绕过警告,或者在新的约定可用时使用它。

不幸的是,使用新行为只能通过调用 np.array(array_like) .

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

arr = np.empty(3, dtype=object)
arr[:] = [array_like1, array_like2, array_like3]

这将确保NumPy知道不要像这样进入数组,而是将其用作对象。

(gh-17973 ()

未来变化

数组不能使用子数组数据类型

使用 np.array(arr, dtype)arr.astype(dtype) 将使用不同的逻辑 dtype 是子数组数据类型,例如 np.dtype("(2)i,") .

对于这样一个 dtype 以下行为是正确的:

res = np.array(arr, dtype)

res.dtype is not dtype
res.dtype is dtype.base
res.shape == arr.shape + dtype.shape

但是 res 使用以下逻辑填充:

res = np.empty(arr.shape + dtype.shape, dtype=dtype.base)
res[...] = arr

使用不正确的广播(通常会导致错误)。在将来,这将分别对每个元素进行强制转换,结果如下:

res = np.array(arr, dtype=np.dtype(["f", dtype]))["f"]

通常可以用来选择新的行为。

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

(gh-17596 ()

过期的折旧

  • 数字样式类型代码的弃用 np.dtype("Complex64") (大写拼写),已过期。 "Complex64" 一致 "complex128""Complex32" 一致 "complex64" .

  • 反对 np.sctypeNAnp.typeNA 已过期。两者都已从公共API中删除。使用 np.typeDict 相反。

    (gh-16554 ()

  • 14年来 np.ctypeslib.ctypes_load_library 已过期。使用 load_library 相反,这是相同的。

    (gh-17116 ()

取消财务职能

根据NEP 32,财务职能从NumPy 1.20中删除。已删除的功能包括 fvipmtirrmirrnpernpvpmtppmtpvrate . 这些功能在 numpy_financial 类库。

(gh-17067 ()

兼容性说明

isinstance(dtype, np.dtype) and not type(dtype) is not np.dtype

NumPy数据类型不是 np.dtype 不再。可能使用的代码 type(dtype) is np.dtype 会一直回来的 False 必须更新以使用正确的版本 isinstance(dtype, np.dtype) .

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

同类铸造与 axis=None

什么时候? concatenate 被调用 axis=None ,扁平阵列用 unsafe . 任何其他轴选择使用“同类”。不同的默认值已被弃用,将改用“同类”转换。新的 casting 关键字参数可用于保留旧行为。

(gh-16134 ()

NumPy标量在指定给数组时被强制转换

当创建或指定给数组时,在所有相关的情况下,NumPy标量现在将以相同的方式强制转换为NumPy数组。特别是在某些情况下,这会改变以前引发错误的行为:

np.array([np.float64(np.nan)], dtype=np.int64)

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

arr[0] = np.float64(np.nan)

此时,NumPy保留以下行为:

np.array(np.float64(np.nan), dtype=np.int64)

以上更改不会影响Python标量:

np.array([float("NaN")], dtype=np.int64)

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

np.array([np.float64(np.nan)], dtype=np.uint64)

为避免向后兼容性问题,此时从 datetime64 仍然支持将标量转换为长度过短的字符串。这意味着 np.asarray(np.datetime64("2020-10-10"), dtype="S5") 现在成功了,以前失败了。从长远来看,这可能会被弃用,或者不安全的强制转换通常会被允许使数组和标量的赋值行为一致。

当字符串和其他类型混合时,数组强制会改变

当字符串和其他类型混合时,例如:

np.array(["string", np.float64(3.)], dtype="S")

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

如果 dtype="S" 提供的结果将与以前基本相同,但是NumPy标量(不是类似Python的float) 1.0 ),仍将强制执行统一的字符串长度:

np.array([np.float64(3.)], dtype="S")  # gives "S32"
np.array([3.0], dtype="S")  # gives "S3"

以前,第一个版本给出了与第二个版本相同的结果。

数组强制重构

数组强制已重新构造。一般来说,这不应该影响用户。在极为罕见的嵌套类数组的情况下:

np.array([array_like1])

现在情况将更加一致:

np.array([np.array(array_like1)])

这会微妙地改变一些定义不好的数组的输出。这方面的一个例子是类似数组的对象,它们也不是形状匹配的序列。在NUMPY1.20中,当数组like不是一个序列(但行为仍然相同,请参阅弃用)时,将发出警告。如果一个数组也是一个序列(定义 __getitem____len__ )NumPy现在只使用 __array____array_interface____array_struct__ . 当(嵌套的)序列描述不同的形状时,这将导致差异。

(gh-16200 ()

写的结果 numpy.broadcast_arrays 只读将导出缓冲区

在NumPy 1.17中 numpy.broadcast_arrays started warning when the resulting array was written to. This warning was skipped when the array was used through the buffer interface (e.g. memoryview(arr)). The same thing will now occur for the two protocols _ _数组接口,和 ``__array_struct__ 返回只读缓冲区而不是发出警告。

(gh-16350 ()

数字样式类型名称已从类型字典中删除

与反对意见保持同步 np.dtype("Complex64") 以及其他数字样式(大写)类型。这些都是从 np.sctypeDictnp.typeDict . 你应该改用小写版本。请注意 "Complex64" 对应于 "complex128""Complex32" 对应于 "complex64" . numpy样式(新)版本表示实部/虚部的完整大小,而不是其大小。

(gh-16554 ()

这个 operator.concat 函数现在为数组参数引发TypeError

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

(gh-16570 ()

nickname 属性已从ABCPolyBase中删除

抽象财产 nickname 已从中删除 ABCPolyBase 因为它不再在派生的便利类中使用。这可能会影响从中派生类的用户 ABCPolyBase 并重写了表示和显示的方法,例如。 __str____repr___repr_latex 等。

(gh-16589 ()

float->timedeltauint64->timedelta 升职将引发类型错误

Float和timedelta升级始终会引发类型错误。 np.promote_types("float32", "m8") 与…对齐 np.promote_types("m8", "float32") 现在和都会引发一个TypeError。以前, np.promote_types("float32", "m8") 返回 "m8" 这被认为是一个错误。

Uint64和timedelta升级始终引发类型错误。 np.promote_types("uint64", "m8") 与…对齐 np.promote_types("m8", "uint64") 现在和都会引发一个TypeError。以前, np.promote_types("uint64", "m8") 返回 "m8" 这被认为是一个错误。

(gh-16592 ()

numpy.genfromtxt 现在正确地解压结构化数组

以前, numpy.genfromtxt 如果用调用它,则无法解包 unpack=True 并将结构化数据类型传递给 dtype 参数(或 dtype=None 已传递,并推断出结构化数据类型)。例如::

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

结构化数组现在将正确地解压到数组列表中,每列一个:

>>> np.genfromtxt(data, dtype=None, unpack=True)
[array([21, 35]), array([58., 72.])]

(gh-16650 ()

mgridr_ 等一致地返回非默认精度输入的正确输出

以前, np.mgrid[np.float32(0.1):np.float32(0.35):np.float32(0.1),]np.r_[0:10:np.complex64(3j)] 未能返回有意义的输出。此错误可能会影响 mgridogridr_c_ 当输入的数据类型不是默认值时 float64complex128 并使用了等效的Python类型。正确处理不同精度的方法。

(gh-16815 ()

具有不匹配形状的布尔数组索引现在正确地给出 IndexError

以前,如果布尔数组索引与索引数组的大小匹配,但与形状不匹配,则在某些情况下不允许这样做。在其他情况下,它给出了一个错误,但错误是错误的 ValueError 用一个关于广播的信息而不是正确的 IndexError .

例如,以下用于错误地给出 ValueError: operands could not be broadcast together with shapes (2,2) (1,4)

np.empty((2, 2))[np.array([[True, False, False, False]])]

以下是错误返回的 array([], dtype=float64)

np.empty((2, 2))[np.array([[False, False, False, False]])]

现在两者都正确地给出 IndexError: boolean index did not match indexed array along dimension 0; dimension is 2 but corresponding boolean dimension is 1 .

(gh-17010 ()

铸造错误中断迭代

在强制转换值时进行迭代时,错误可能会比以前更早地停止迭代。在任何情况下,失败的强制转换操作总是返回未定义的部分结果。这些现在可能更加不明确和片面。对于 NpyIter C-API这样的强制转换错误现在将导致 iternext() 函数返回0,从而中止迭代。要直接检测到这样的API,目前还没有。有必要检查一下 PyErr_Occurred() ,这可能与 NpyIter_Reset . 这些问题一直存在,但如果用户需要,可以添加新的API。

(gh-17029 ()

f2py生成的代码可能返回unicode而不是字节字符串

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

(gh-17068 ()

第一个元素 __array_interface__["data"] 元组必须是整数

这个接口已经被文档化很多年了,但是仍然有一些代码可以接受指针地址的字节字符串表示。作为一个字节字符串,raise代码将被删除。

(gh-17241 ()

poly1d尊重所有零参数的数据类型

以前,构造 poly1d 如果系数为零,则将系数转换为 np.float64 . 这影响了构造 poly1d 内部实例,例如 np.polymul .

(gh-17577 ()

swig的numpy.i文件只有python3。

Python2.7C-API函数的用法仅更新为Python3。需要旧版本的用户应该使用旧版本的NumPy。

(gh-17580 ()

中的无效数据类型发现 np.array

在通话中使用 np.array(..., dtype="V")arr.astype("V") ,类似的,除非所有元素都具有相同的空位长度,否则TypeError现在将正确引发。例如:

np.array([b"1", b"12"], dtype="V")

它以前返回了一个带有dtype的数组 "V2" 不能代表 b"1" 忠实地。

(gh-17706 ()

C API更改

这个 PyArray_DescrCheck 宏已修改

这个 PyArray_DescrCheck 宏已从NumPy 1.16.6更新为:

#define PyArray_DescrCheck(op) PyObject_TypeCheck(op, &PyArrayDescr_Type)

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

PyObject_TypeCheck(op, &PyArrayDescr_Type)

与所有NumPy版本兼容。

尺寸 np.ndarraynp.void_ 改变

大小 PyArrayObjectPyVoidScalarObject 结构发生了变化。已删除以下标头定义:

#define NPY_SIZEOF_PYARRAYOBJECT (sizeof(PyArrayObject_fields))

因为大小不能被视为编译时常量:它会因NumPy的不同运行时版本而改变。

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

NumPy将尝试给出一个优美的错误,但是一个需要固定结构大小的程序可能有未定义的行为,并且可能会崩溃。

(gh-16938 ()

新特点

where 的关键字参数 numpy.allnumpy.any 功能

关键字参数 where 的布尔求值中,只允许考虑数组中的指定元素或子轴 allany . 此新关键字可用于函数 allany 都是通过 numpy 直接地或以 numpy.ndarray .

任何可广播的布尔数组或标量都可以设置为 where . 它默认为 True 若要计算数组中所有元素的函数 where 不是由用户设置的。函数的文档中给出了示例。

where keyword argument for numpy functions mean, std, var

关键字参数 where 增加并允许限制计算的范围 meanstdvar 只有一个子集的元素。可通过以下两种方式获得 numpy 直接地或以 numpy.ndarray .

任何可广播的布尔数组或标量都可以设置为 where . 它默认为 True 若要计算数组中所有元素的函数 where 不是由用户设置的。函数的文档中给出了示例。

(gh-15852 ()

norm=backwardforward 关键字选项 numpy.fft 功能

关键字参数选项 norm=backward 作为的别名添加 None 和作为默认选项;使用它可以使直接变换不缩放,而逆变换按比例缩放 1/n .

使用new关键字参数选项 norm=forward 直接变换是否按比例缩放 1/n 逆变换不标度(即与默认选项正好相反) norm=backward

(gh-16476 ()

NumPy现在已键入

NumPy的大部分都添加了类型注释。还有一个新的 numpy.typing 包含对最终用户有用的类型的模块。当前可用的类型有

  • ArrayLike :对于可以强制为数组的对象

  • DtypeLike :对于可以强制为数据类型的对象

(gh-16515 ()

numpy.typing 在运行时可访问

中的类型 numpy.typing 现在可以在运行时导入。下面这样的代码现在可以工作了:

from numpy.typing import ArrayLike
x: ArrayLike = [1, 2, 3, 4]

(gh-16558 ()

新的 __f2py_numpy_version__ f2py生成的模块的属性。

因为f2py是和NumPy一起发布的, __f2py_numpy_version__ 提供跟踪用于生成模块的版本f2py的方法。

(gh-16594 ()

mypy 测试可以通过运行测试.py

当前运行配置了NumPy存根的mypy需要:

  • 安装Numpy

  • 将源目录添加到MYPYPATH并链接到 mypy.ini

两个选项都有点不方便,所以添加一个 --mypy 选项来运行测试,处理为您设置的事情。这在将来对任何类型的codegen都很有用,因为它将确保在类型检查之前构建项目。

(gh-17123 ()

否定用户定义的BLAS/LAPACK检测顺序

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

NPY_BLAS_ORDER='^blas' NPY_LAPACK_ORDER='^lapack' python setup.py build

它将使用任何一个加速库。

(gh-17219 ()

允许向asv生成传递优化参数

现在可以通过了 -j--cpu-baseline--cpu-dispatch--disable-optimization--bench-compare 使用了参数。

(gh-17284 ()

现在支持NVIDIA HPC SDK nvfortran编译器

增加了对nvfortran编译器(pgfortran的一个版本)的支持。

(gh-17344 ()

dtype option for cov and corrcoef

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

(gh-17456 ()

改进

多项式的改进字符串表示法 (__str__

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

(gh-15666 ()

删除Accelerate库作为候选LAPACK库

苹果不再支持Accelerate。拆下它。

(gh-15759 ()

包含多行对象的对象数组具有更高的可读性 repr

如果对象数组的元素具有 repr 如果包含新行,则换行的行将按列对齐。值得注意的是,这提高了 repr 嵌套数组的数目:

>>> np.array([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)

(gh-15997 ()

Concatenate支持提供输出数据类型

支持已添加到 concatenate 提供输出 dtypecasting 使用关键字参数。这个 dtype 参数不能与 out 一个。

(gh-16134 ()

线程安全的f2py回调函数

f2py中的回调函数现在是线程安全的。

(gh-16519 ()

numpy.core.records.fromfile 现在支持类似文件的对象

numpy.rec.fromfile can now use file-like objects, for instance io.BytesIO

(gh-16675 ()

AIX上的RPATH支持添加到distutils

这允许在AIX上构建SciPy。

(gh-16710 ()

使用命令行参数指定的f90编译器

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

(gh-16730 ()

为cython3.0及更高版本添加NumPy声明

cython3.0的pxd声明得到了改进,以避免使用不推荐的numpyc-API特性。使用cython3.0+构建的使用NumPy的扩展模块现在可以设置C宏 NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION 避免C编译器警告不推荐的API用法。

(gh-16986 ()

使窗口函数完全对称

确保NumPy提供的窗口函数是对称的。以前由于数值精度的原因,对称性有一些小的偏差,现在通过更好的计算安排可以避免这些偏差。

(gh-17195 ()

性能改进和更改

启用多平台SIMD编译器优化

一系列的改善为NumPy的基础设施铺平了道路 NEP-38 ,概括如下:

  • 新生成参数

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

    • --cpu-dispatch 要指定已调度的附加优化集,默认值为 max -xop -fma4 它启用了除AMD遗留功能之外的所有CPU功能。

    • --disable-optimization 为了显式地禁用整个新的改进,它还添加了一个新的 C 编译器#定义已调用 NPY_DISABLE_OPTIMIZATION 它可以用作任何SIMD代码的保护。

  • 高级CPU调度器

    一个灵活的跨体系结构CPU调度器构建在Python/Numpy distutils之上,支持所有具有广泛CPU特性的通用编译器。

    新的调度程序需要一个特殊的文件扩展名 *.dispatch.c 标记可调度 C 消息来源。这些源代码能够被多次编译,因此每个编译过程都代表特定的CPU功能,并提供不同的定义和标志,这些定义和标志会影响代码路径。

  • New auto-generated C header ``core/src/common/_cpu_dispatch.h``

    此标头由distutils模块生成 ccompiler_opt ,并包含通过命令参数“-cpu baseline”和“-cpu dispatch”配置的指令集的所有#定义和标头。

  • New C header ``core/src/common/npy_cpu_dispatch.h``

    这个头文件包含了整个CPU调度过程所需的所有实用程序,它也可以被看作是连接新基础结构工作和numpycpu运行时检测的桥梁。

  • 向NumPy umath模块添加新属性(Python级别)

    • __cpu_baseline__ 列表包含编译器和平台根据命令参数'--cpu baseline'的指定值所支持的所需优化的最小集合。

    • __cpu_dispatch__ 列表包含编译器和平台根据命令参数'--cpu dispatch'的指定值支持的附加优化的调度集。

  • 在PytestTester运行期间打印支持的CPU特性

(gh-13516 ()

变化

np.linspace 在整数上现在使用floor

当使用 int 数据输入 numpy.linspace ,以前的浮点值将向零舍入。现在 numpy.floor 取而代之的是 -inf . 这会更改负值的结果。例如,以下内容以前会给出:

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

结果是:

>>> np.linspace(-3, 1, 8, dtype=int)
array([-3, -3, -2, -2, -1, -1,  0,  1])

前一个结果仍然可以通过以下方法获得:

>>> np.linspace(-3, 1, 8).astype(int)
array([-3, -2, -1, -1,  0,  0,  0,  1])

(gh-16841 ()