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