数组 API 标准兼容性#
笔记
该numpy.array_api
模块仍处于实验阶段。参见NEP 47。
NumPy包含数组 API 标准的参考实现numpy.array_api
。NEP 47描述了在 NumPy 中实现数组 API 标准的动机和范围。
该numpy.array_api
模块充当数组 API 标准的最小参考实现。在最小化中,该模块仅实现规范明确要求的那些内容。某些事情是规范允许的,但在
numpy.array_api
.这样该模块就可以作为数组 API 标准用户的参考实现。数组 API 的任何使用者都可以测试他们的代码,numpy.array_api
并确保他们没有使用规范未保证的任何功能,以及其他符合标准的库中可能不存在的功能。
numpy.array_api
此处未记录该模块。有关数组 API 规范中存在的函数列表,请参阅数组 API 标准。该numpy.array_api
实现在功能上是完整的,因此标准中描述的所有功能都已实现。
numpy.array_api
和#之间的差异表numpy
numpy.array_api
此表概述了与主命名空间之间的主要区别numpy
。差异可分为三类:
严格。所做的事情只是为了
numpy.array_api
严格、最低限度的实施。规范实际上并不要求它们,并且其他符合标准的库可能不遵循它们。在大多数情况下,规范不指定或要求给定域之外的任何行为。主numpy
命名空间无需以任何方式更改即可与这些规范兼容。兼容的。可以添加到主命名
numpy
空间而不破坏向后兼容性的东西。打破。如果在主命名空间中实现,则会破坏向后兼容性
numpy
。
名称差异#
NumPy 规范中的许多函数已被重命名。除非另有说明,否则这些在行为上是相同的,因此都是兼容的更改。
函数名称更改#
以下函数在数组 API 中的命名不同
数组 API 名称 |
NumPy 命名空间名称 |
笔记 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这是破坏性的,因为 |
|
|
|
|
|
|
|
|
与 不同的是 |
|
|
|
|
|
每个都相当于 |
函数而不是方法#
astype
是数组 API 中的函数,而它是ndarray
in中的方法numpy
。
linalg
命名空间差异#
这些函数位于linalg
数组 API 的子命名空间中,但仅位于 NumPy 的顶级命名空间中:
cross
diagonal
matmul
(*)outer
tensordot
(*)trace
(*):这些函数也位于数组 API 的顶级命名空间中。
关键字参数重命名#
以下函数具有已重命名的关键字参数。除非另有说明,否则关键字参数的功能是相同的。具有相同语义定义的重命名关键字参数可能被视为兼容或破坏,具体取决于更改的实现方式。
请注意,此页面不会列出位于主
numpy
命名空间但不在数组 API 中的函数关键字参数。numpy.array_api
为了严格性,此类关键字参数被省略,因为规范允许函数包含所需的附加关键字参数。
功能 |
数组 API 关键字名称 |
NumPy 关键字名称 |
笔记 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
该参数可以作为 NumPy 和数组 API 的位置参数或关键字参数传递。 |
类型促销差异#
类型提升是 NumPy 偏离规范的最大领域。最显着的区别是 NumPy 在许多情况下进行基于值的转换。该规范明确禁止基于值的转换。在数组 API 中,任何操作的结果类型始终完全由输入类型决定,与值或形状无关。
特征 |
类型 |
笔记 |
---|---|---|
有限的数据类型集。 |
严格 |
|
Python 标量的运算符(如 |
严格 |
例如,不允许。请参阅混合数组和 Python 标量的规范规则。 |
Python 标量的运算符(如 |
打破 |
例如,是一个
数组。 |
当提升左侧时,不允许使用就地运算符。 |
打破 |
例子:。规范明确不允许这样做。 |
当右侧操作数无法广播到左侧操作数的形状时,不允许使用就地运算符。 |
严格 |
这种所谓的“反向传播”是不应该被允许的。示例:
应该错误。请参阅
https://github.com/numpy/numpy/issues/10404。 |
|
严格 |
|
|
打破 |
例如,是。请注意,这是对 0 维数组而不是标量进行基于值的转换。 |
无跨种铸造。 |
严格 |
也就是说,布尔、整数和浮点数据类型不会相互转换,除非显式使用 |
不能将无符号整数数据类型转换为浮点数据类型(例如,. |
严格 |
|
|
严格 |
这些 |
|
打破 |
索引差异#
该规范仅需要索引的子集,但规范中的所有索引规则都与 NumPy 更广泛的索引规则兼容。
特征 |
类型 |
笔记 |
---|---|---|
没有隐式省略号 ( |
严格 |
如果索引不包含省略号,则必须对所有轴进行索引。 |
切片的开始和结束不得越界。 |
严格 |
对于 slice
|
布尔数组索引仅允许作为唯一索引。 |
严格 |
|
根本不允许整数数组索引。 |
严格 |
0 维数组除外,它们被视为整数。 |
类型严格#
函数将numpy.array_api
其输入限制为规范明确要求的数据类型,即使包装的相应 NumPy 函数允许更广泛的集合。在这里,我们列出了每个函数以及numpy.array_api
.这些是严格性
差异,因为规范不要求其他数据类型导致错误。这里的类别定义如下:
浮点数:
float32
或float64
.Integer:任何有符号或无符号整数数据类型(
int8
、int16
、int32
、int64
、uint8
、uint16
、uint32
、 或uint64
)。布尔值:
bool
.Integer 或 boolean:任何有符号或无符号整数数据类型,或
bool
.对于双参数函数,两个参数都必须是整数或者都必须是bool
。Numeric:任何整数或浮点数据类型。对于双参数函数,两个参数都必须是整数或都必须是浮点型。
All:上述任何 dtype 类别。对于双参数函数,两个参数必须是同一类型(整数、浮点数或布尔值)。
在所有情况下,返回数据类型都是根据规范 中概述的规则进行选择的,并且与任何允许的输入数据类型的 NumPy 的返回数据类型没有不同,除了下面小节中特别提到的情况。
逐元素函数#
函数名称 |
数据类型 |
---|---|
|
数字 |
|
浮点 |
|
浮点 |
|
数字 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
整数或布尔值 |
|
整数或布尔值 |
|
整数 |
|
整数或布尔值 |
|
整数 |
|
整数或布尔值 |
|
数字 |
|
浮点 |
|
浮点 |
|
浮点 |
|
全部 |
|
浮点 |
|
浮点 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
布尔值 |
|
布尔值 |
|
布尔值 |
|
布尔值 |
|
数字 |
|
数字 |
|
全部 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
数字 |
|
浮点 |
|
浮点 |
|
浮点 |
|
数字 |
|
数字 |
|
浮点 |
|
浮点 |
|
数字 |
(*) 这些函数的名称与主命名空间不同numpy
。请参阅函数名称更改。
创建函数#
函数名称 |
数据类型 |
---|---|
|
任意(所有输入数据类型必须相同) |
线性代数函数#
函数名称 |
数据类型 |
---|---|
|
浮点 |
|
数字 |
|
浮点 |
|
任何 |
|
浮点 |
|
浮点 |
|
浮点 |
|
数字 |
|
浮点 |
|
浮点 |
|
浮点 |
|
任何 |
|
数字 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
浮点 |
|
数字 |
|
数字 |
|
数字 |
|
浮点 |
(*) 这些函数是从norm
主numpy
命名空间中分离出来的。请参阅函数名称更改。
(**) 这些函数是数组 API 中的新函数,不在主命名
空间中numpy
。
数组对象#
__operator__
数组对象上的所有特殊方法的行为与其相应的函数相同(
有关哪些方法对应于哪些函数的列表,请参阅规范)。例外情况是,运算符根据规范中概述的规则显式允许 Python 标量
(请参阅类型提升差异)。
数组对象差异#
特征 |
类型 |
笔记 |
---|---|---|
没有数组标量 |
严格 |
该规范没有数组标量,只有 0 维数组。但是,除了 类型提升差异中概述的提升差异之外,出于规范的目的,标量将类型鸭为 0 维数组。它们是不可变的,但规范 不要求可变性。 |
|
严格 |
|
|
兼容的 |
|
|
兼容的 |
请参阅
的规范定义 |
|
打破 |
请参阅规范中的注释。 |
新方法 |
兼容的 |
这些方法实际上不会执行任何操作,因为 NumPy 仅适用于 CPU |
创建函数差异#
特征 |
类型 |
笔记 |
---|---|---|
|
兼容的 |
|
所有数组创建函数的新 |
兼容的 |
|
逐元素函数差异#
特征 |
类型 |
笔记 |
---|---|---|
各种功能已被重命名。 |
兼容的 |
请参阅函数名称更改。 |
仅针对给定的输入类型组合定义逐元素函数。 |
严格 |
请参阅类型严格性。 |
|
严格 |
|
|
打破 |
|
线性代数差异#
特征 |
类型 |
笔记 |
---|---|---|
|
兼容的 |
|
|
打破 |
|
|
打破 |
严格来说,这是可以兼容的,因为 |
|
兼容的 |
相应的 |
新功能 |
兼容的 |
该 |
|
打破 |
在数组 API 中, |
|
打破 |
|
新功能 |
兼容的 |
与 不同 |
|
打破 |
该规范目前仅指定一维数组上的行为,但未来的行为可能是广播,而不是展平,这正是所做的 |
|
打破 |
|
|
打破 |
行为 |
新功能 |
兼容的 |
相当于 |
关键字 |
兼容的 |
在 中 |
|
打破 |
|
操作函数差异#
特征 |
类型 |
笔记 |
---|---|---|
各种功能已重命名 |
兼容的 |
请参阅函数名称更改。 |
|
严格 |
无跨种铸造。标量上没有基于值的转换(当 axis=None 时)。 |
|
严格 |
无跨种铸造。 |
新功能 |
兼容的 |
与 不同 |
|
兼容的 |
设置函数差异#
特征 |
类型 |
笔记 |
---|---|---|
新函数 |
兼容的 |
请参阅函数名称更改。 |
这四个 |
兼容的 |
|
|
兼容的 |
设置函数差异#
特征 |
类型 |
笔记 |
---|---|---|
|
打破 |
|
|
兼容的 |
统计函数差异#
特征 |
类型 |
笔记 |
---|---|---|
|
打破 |
|
|
兼容的 |
其他差异#
特征 |
类型 |
笔记 |
---|---|---|
Dtype 只能拼写为 dtype 对象。 |
严格 |
例如,不允许。 |
|
严格 |
Python 运算符是个例外,它在某些情况下接受 Python 标量(请参阅类型提升差异)。 |
|
严格 |
|
finfo() 返回类型用于 |
严格 |
该规范允许鸭子类型,因此 |
每个函数中的位置参数都是位置参数。 |
打破 |
请参阅规范以了解每个函数的确切签名。请注意,NumPy ufunc 已经使用仅位置参数,但非 ufunc 通常
|