NumPy-源码解析-九十一-

112 阅读1小时+

NumPy 源码解析(九十一)

.\numpy\numpy\_typing\_char_codes.py

from typing import Literal

# 定义布尔类型的字面量类型
_BoolCodes = Literal["?", "=?", "<?", ">?", "bool", "bool_"]

# 定义无符号整数类型的字面量类型
_UInt8Codes = Literal["uint8", "u1", "=u1", "<u1", ">u1"]
_UInt16Codes = Literal["uint16", "u2", "=u2", "<u2", ">u2"]
_UInt32Codes = Literal["uint32", "u4", "=u4", "<u4", ">u4"]
_UInt64Codes = Literal["uint64", "u8", "=u8", "<u8", ">u8"]

# 定义有符号整数类型的字面量类型
_Int8Codes = Literal["int8", "i1", "=i1", "<i1", ">i1"]
_Int16Codes = Literal["int16", "i2", "=i2", "<i2", ">i2"]
_Int32Codes = Literal["int32", "i4", "=i4", "<i4", ">i4"]
_Int64Codes = Literal["int64", "i8", "=i8", "<i8", ">i8"]

# 定义浮点数类型的字面量类型
_Float16Codes = Literal["float16", "f2", "=f2", "<f2", ">f2"]
_Float32Codes = Literal["float32", "f4", "=f4", "<f4", ">f4"]
_Float64Codes = Literal["float64", "f8", "=f8", "<f8", ">f8"]

# 定义复数类型的字面量类型
_Complex64Codes = Literal["complex64", "c8", "=c8", "<c8", ">c8"]
_Complex128Codes = Literal["complex128", "c16", "=c16", "<c16", ">c16"]

# 定义字节类型的字面量类型
_ByteCodes = Literal["byte", "b", "=b", "<b", ">b"]
_ShortCodes = Literal["short", "h", "=h", "<h", ">h"]
_IntCCodes = Literal["intc", "i", "=i", "<i", ">i"]
_IntPCodes = Literal["intp", "int", "int_", "n", "=n", "<n", ">n"]
_LongCodes = Literal["long", "l", "=l", "<l", ">l"]
_IntCodes = _IntPCodes
_LongLongCodes = Literal["longlong", "q", "=q", "<q", ">q"]

# 定义无符号字节类型的字面量类型
_UByteCodes = Literal["ubyte", "B", "=B", "<B", ">B"]
_UShortCodes = Literal["ushort", "H", "=H", "<H", ">H"]
_UIntCCodes = Literal["uintc", "I", "=I", "<I", ">I"]
_UIntPCodes = Literal["uintp", "uint", "N", "=N", "<N", ">N"]
_ULongCodes = Literal["ulong", "L", "=L", "<L", ">L"]
_UIntCodes = _UIntPCodes
_ULongLongCodes = Literal["ulonglong", "Q", "=Q", "<Q", ">Q"]

# 定义半精度浮点数类型的字面量类型
_HalfCodes = Literal["half", "e", "=e", "<e", ">e"]
_SingleCodes = Literal["single", "f", "=f", "<f", ">f"]
_DoubleCodes = Literal["double", "float", "d", "=d", "<d", ">d"]
_LongDoubleCodes = Literal["longdouble", "g", "=g", "<g", ">g"]

# 定义复数单精度浮点数类型的字面量类型
_CSingleCodes = Literal["csingle", "F", "=F", "<F", ">F"]
_CDoubleCodes = Literal["cdouble", "complex", "D", "=D", "<D", ">D"]
_CLongDoubleCodes = Literal["clongdouble", "G", "=G", "<G", ">G"]

# 定义字符串类型的字面量类型
_StrCodes = Literal["str", "str_", "unicode", "U", "=U", "<U", ">U"]

# 定义字节串类型的字面量类型
_BytesCodes = Literal["bytes", "bytes_", "S", "=S", "<S", ">S"]

# 定义空类型的字面量类型
_VoidCodes = Literal["void", "V", "=V", "<V", ">V"]

# 定义对象类型的字面量类型
_ObjectCodes = Literal["object", "object_", "O", "=O", "<O", ">O"]

# 定义日期时间类型的字面量类型
_DT64Codes = Literal[
    "datetime64", "=datetime64", "<datetime64", ">datetime64",
    "datetime64[Y]", "=datetime64[Y]", "<datetime64[Y]", ">datetime64[Y]",
    "datetime64[M]", "=datetime64[M]", "<datetime64[M]", ">datetime64[M]",
    "datetime64[W]", "=datetime64[W]", "<datetime64[W]", ">datetime64[W]",
    "datetime64[D]", "=datetime64[D]", "<datetime64[D]", ">datetime64[D]",
    "datetime64[h]", "=datetime64[h]", "<datetime64[h]", ">datetime64[h]",
    "datetime64[m]", "=datetime64[m]", "<datetime64[m]", ">datetime64[m]",
    "datetime64[s]", "=datetime64[s]", "<datetime64[s]", ">datetime64[s]",
    "datetime64[ms]", "=datetime64[ms]", "<datetime64[ms]", ">datetime64[ms]",
]
    # 定义一系列字符串,用于描述不同的 datetime64 类型和其比较运算符
    "datetime64[us]", "=datetime64[us]", "<datetime64[us]", ">datetime64[us]",
    "datetime64[ns]", "=datetime64[ns]", "<datetime64[ns]", ">datetime64[ns]",
    "datetime64[ps]", "=datetime64[ps]", "<datetime64[ps]", ">datetime64[ps]",
    "datetime64[fs]", "=datetime64[fs]", "<datetime64[fs]", ">datetime64[fs]",
    "datetime64[as]", "=datetime64[as]", "<datetime64[as]", ">datetime64[as]",
    "M", "=M", "<M", ">M",
    "M8", "=M8", "<M8", ">M8",
    "M8[Y]", "=M8[Y]", "<M8[Y]", ">M8[Y]",
    "M8[M]", "=M8[M]", "<M8[M]", ">M8[M]",
    "M8[W]", "=M8[W]", "<M8[W]", ">M8[W]",
    "M8[D]", "=M8[D]", "<M8[D]", ">M8[D]",
    "M8[h]", "=M8[h]", "<M8[h]", ">M8[h]",
    "M8[m]", "=M8[m]", "<M8[m]", ">M8[m]",
    "M8[s]", "=M8[s]", "<M8[s]", ">M8[s]",
    "M8[ms]", "=M8[ms]", "<M8[ms]", ">M8[ms]",
    "M8[us]", "=M8[us]", "<M8[us]", ">M8[us]",
    "M8[ns]", "=M8[ns]", "<M8[ns]", ">M8[ns]",
    "M8[ps]", "=M8[ps]", "<M8[ps]", ">M8[ps]",
    "M8[fs]", "=M8[fs]", "<M8[fs]", ">M8[fs]",
    "M8[as]", "=M8[as]", "<M8[as]", ">M8[as]",
# 定义了一个类型注解 Literal,表示接受的字面量类型为 timedelta64 和其变体
_TD64Codes = Literal[
    "timedelta64", "=timedelta64", "<timedelta64", ">timedelta64",
    "timedelta64[Y]", "=timedelta64[Y]", "<timedelta64[Y]", ">timedelta64[Y]",
    "timedelta64[M]", "=timedelta64[M]", "<timedelta64[M]", ">timedelta64[M]",
    "timedelta64[W]", "=timedelta64[W]", "<timedelta64[W]", ">timedelta64[W]",
    "timedelta64[D]", "=timedelta64[D]", "<timedelta64[D]", ">timedelta64[D]",
    "timedelta64[h]", "=timedelta64[h]", "<timedelta64[h]", ">timedelta64[h]",
    "timedelta64[m]", "=timedelta64[m]", "<timedelta64[m]", ">timedelta64[m]",
    "timedelta64[s]", "=timedelta64[s]", "<timedelta64[s]", ">timedelta64[s]",
    "timedelta64[ms]", "=timedelta64[ms]", "<timedelta64[ms]", ">timedelta64[ms]",
    "timedelta64[us]", "=timedelta64[us]", "<timedelta64[us]", ">timedelta64[us]",
    "timedelta64[ns]", "=timedelta64[ns]", "<timedelta64[ns]", ">timedelta64[ns]",
    "timedelta64[ps]", "=timedelta64[ps]", "<timedelta64[ps]", ">timedelta64[ps]",
    "timedelta64[fs]", "=timedelta64[fs]", "<timedelta64[fs]", ">timedelta64[fs]",
    "timedelta64[as]", "=timedelta64[as]", "<timedelta64[as]", ">timedelta64[as]",
    "m", "=m", "<m", ">m",
    "m8", "=m8", "<m8", ">m8",
    "m8[Y]", "=m8[Y]", "<m8[Y]", ">m8[Y]",
    "m8[M]", "=m8[M]", "<m8[M]", ">m8[M]",
    "m8[W]", "=m8[W]", "<m8[W]", ">m8[W]",
    "m8[D]", "=m8[D]", "<m8[D]", ">m8[D]",
    "m8[h]", "=m8[h]", "<m8[h]", ">m8[h]",
    "m8[m]", "=m8[m]", "<m8[m]", ">m8[m]",
    "m8[s]", "=m8[s]", "<m8[s]", ">m8[s]",
    "m8[ms]", "=m8[ms]", "<m8[ms]", ">m8[ms]",
    "m8[us]", "=m8[us]", "<m8[us]", ">m8[us]",
    "m8[ns]", "=m8[ns]", "<m8[ns]", ">m8[ns]",
    "m8[ps]", "=m8[ps]", "<m8[ps]", ">m8[ps]",
    "m8[fs]", "=m8[fs]", "<m8[fs]", ">m8[fs]",
    "m8[as]", "=m8[as]", "<m8[as]", ">m8[as]",
]

.\numpy\numpy\_typing\_dtype_like.py

# 从 collections.abc 模块导入 Sequence 抽象基类
from collections.abc import Sequence
# 导入类型提示模块中的必要类和函数
from typing import (
    Any,
    Sequence,
    Union,
    TypeVar,
    Protocol,
    TypedDict,
    runtime_checkable,
)
# 导入 NumPy 库并使用 np 别名
import numpy as np

# 导入 _ShapeLike 类
from ._shape import _ShapeLike

# 从 _char_codes 模块导入多个数据类型的编码,包括布尔、整数和浮点数等
from ._char_codes import (
    _BoolCodes,
    _UInt8Codes,
    _UInt16Codes,
    _UInt32Codes,
    _UInt64Codes,
    _Int8Codes,
    _Int16Codes,
    _Int32Codes,
    _Int64Codes,
    _Float16Codes,
    _Float32Codes,
    _Float64Codes,
    _Complex64Codes,
    _Complex128Codes,
    _ByteCodes,
    _ShortCodes,
    _IntCCodes,
    _LongCodes,
    _LongLongCodes,
    _IntPCodes,
    _IntCodes,
    _UByteCodes,
    _UShortCodes,
    _UIntCCodes,
    _ULongCodes,
    _ULongLongCodes,
    _UIntPCodes,
    _UIntCodes,
    _HalfCodes,
    _SingleCodes,
    _DoubleCodes,
    _LongDoubleCodes,
    _CSingleCodes,
    _CDoubleCodes,
    _CLongDoubleCodes,
    _DT64Codes,
    _TD64Codes,
    _StrCodes,
    _BytesCodes,
    _VoidCodes,
    _ObjectCodes,
)

# 定义一个类型变量 _SCT,其类型约束为 np.generic
_SCT = TypeVar("_SCT", bound=np.generic)
# 定义一个协变类型变量 _DType_co,用于 np.dtype 的类型参数
_DType_co = TypeVar("_DType_co", covariant=True, bound=np.dtype[Any])

# 定义一个任意嵌套的 _DTypeLikeNested 类型的别名,目前没有支持递归类型的支持
_DTypeLikeNested = Any  # TODO: wait for support for recursive types

# 强制存在的键
# 定义一个 TypedDict 类型 _DTypeDictBase,包含 names 和 formats 两个必须键
class _DTypeDictBase(TypedDict):
    names: Sequence[str]
    formats: Sequence[_DTypeLikeNested]

# 强制存在和可选存在的键
# 定义一个 TypedDict 类型 _DTypeDict,继承自 _DTypeDictBase,并可选包含 offsets, titles, itemsize 和 aligned 四个键
class _DTypeDict(_DTypeDictBase, total=False):
    # 只有 str 元素可用作索引别名,但 titles 原则上可以接受任何对象
    offsets: Sequence[int]
    titles: Sequence[Any]
    itemsize: int
    aligned: bool

# 一个带有 dtype 属性的任意协议
@runtime_checkable
class _SupportsDType(Protocol[_DType_co]):
    @property
    def dtype(self) -> _DType_co: ...

# _DTypeLike 的子集,可以关于 np.generic 进行参数化
_DTypeLike = Union[
    np.dtype[_SCT],
    type[_SCT],
    _SupportsDType[np.dtype[_SCT]],
]

# 会创建一个 dtype[np.void]
# _VoidDTypeLike 的类型定义,可以是元组、列表或字典等多种形式
_VoidDTypeLike = Union[
    # (灵活的 dtype, itemsize)
    tuple[_DTypeLikeNested, int],
    # (固定的 dtype, shape)
    tuple[_DTypeLikeNested, _ShapeLike],
    # [(field_name, field_dtype, field_shape), ...]
    #
    # 此处的类型非常广泛,因为 NumPy 接受列表中的多种输入;参见测试用例以获取一些示例。
    list[Any],
    # {'names': ..., 'formats': ..., 'offsets': ..., 'titles': ...,
    #  'itemsize': ...}
    _DTypeDict,
    # (基础 dtype, 新 dtype)
    tuple[_DTypeLikeNested, _DTypeLikeNested],
]

# 可以被强制转换为 numpy.dtype 的任何类型
# 参考文档:https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
DTypeLike = Union[
    np.dtype[Any],
    # 默认数据类型 (float64)
    None,
    # 数组标量类型和通用类型
    type[Any],  # 注意:由于对象 dtype,我们受限于 `type[Any]`
    # 任何具有 dtype 属性的对象
    _SupportsDType[np.dtype[Any]],
    # 字符串类型,如字符代码、类型字符串或逗号分隔的字段,例如 'float64'
    str,
    _VoidDTypeLike,
]
# NOTE: while it is possible to provide the dtype as a dict of
# dtype-like objects (e.g. `{'field1': ..., 'field2': ..., ...}`),
# this syntax is officially discouraged and
# therefore not included in the Union defining `DTypeLike`.
#
# See https://github.com/numpy/numpy/issues/16891 for more details.

# 定义布尔类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeBool = Union[
    type[bool],
    type[np.bool],
    np.dtype[np.bool],
    _SupportsDType[np.dtype[np.bool]],
    _BoolCodes,
]

# 定义无符号整数类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeUInt = Union[
    type[np.unsignedinteger],
    np.dtype[np.unsignedinteger],
    _SupportsDType[np.dtype[np.unsignedinteger]],
    _UInt8Codes,
    _UInt16Codes,
    _UInt32Codes,
    _UInt64Codes,
    _UByteCodes,
    _UShortCodes,
    _UIntCCodes,
    _LongCodes,
    _ULongLongCodes,
    _UIntPCodes,
    _UIntCodes,
]

# 定义有符号整数类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeInt = Union[
    type[int],
    type[np.signedinteger],
    np.dtype[np.signedinteger],
    _SupportsDType[np.dtype[np.signedinteger]],
    _Int8Codes,
    _Int16Codes,
    _Int32Codes,
    _Int64Codes,
    _ByteCodes,
    _ShortCodes,
    _IntCCodes,
    _LongCodes,
    _LongLongCodes,
    _IntPCodes,
    _IntCodes,
]

# 定义浮点数类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeFloat = Union[
    type[float],
    type[np.floating],
    np.dtype[np.floating],
    _SupportsDType[np.dtype[np.floating]],
    _Float16Codes,
    _Float32Codes,
    _Float64Codes,
    _HalfCodes,
    _SingleCodes,
    _DoubleCodes,
    _LongDoubleCodes,
]

# 定义复数类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeComplex = Union[
    type[complex],
    type[np.complexfloating],
    np.dtype[np.complexfloating],
    _SupportsDType[np.dtype[np.complexfloating]],
    _Complex64Codes,
    _Complex128Codes,
    _CSingleCodes,
    _CDoubleCodes,
    _CLongDoubleCodes,
]

# 定义时间日期类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeDT64 = Union[
    type[np.timedelta64],
    np.dtype[np.timedelta64],
    _SupportsDType[np.dtype[np.timedelta64]],
    _TD64Codes,
]

# 定义时间间隔类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeTD64 = Union[
    type[np.datetime64],
    np.dtype[np.datetime64],
    _SupportsDType[np.dtype[np.datetime64]],
    _DT64Codes,
]

# 定义字符串类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeStr = Union[
    type[str],
    type[np.str_],
    np.dtype[np.str_],
    _SupportsDType[np.dtype[np.str_]],
    _StrCodes,
]

# 定义字节串类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeBytes = Union[
    type[bytes],
    type[np.bytes_],
    np.dtype[np.bytes_],
    _SupportsDType[np.dtype[np.bytes_]],
    _BytesCodes,
]

# 定义空类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeVoid = Union[
    type[np.void],
    np.dtype[np.void],
    _SupportsDType[np.dtype[np.void]],
    _VoidCodes,
    _VoidDTypeLike,
]

# 定义对象类型相关的数据类型别名,包括各种可能的类型和代码。
_DTypeLikeObject = Union[
    type,
    np.dtype[np.object_],
    _SupportsDType[np.dtype[np.object_]],
    _ObjectCodes,
]

# 定义复合类型的数据类型别名,包括布尔、整数、浮点数和复数类型。
_DTypeLikeComplex_co = Union[
    _DTypeLikeBool,
    _DTypeLikeUInt,
    _DTypeLikeInt,
    _DTypeLikeFloat,
    _DTypeLikeComplex,
]

.\numpy\numpy\_typing\_extended_precision.py

# 导入 NumPy 库,用于科学计算和数组操作
import numpy as np

# 导入当前包中的特定扩展精度类型定义
from . import (
    _80Bit,
    _96Bit,
    _128Bit,
    _256Bit,
)

# 定义无符号整数类型为 128 位
uint128 = np.unsignedinteger[_128Bit]

# 定义无符号整数类型为 256 位
uint256 = np.unsignedinteger[_256Bit]

# 定义有符号整数类型为 128 位
int128 = np.signedinteger[_128Bit]

# 定义有符号整数类型为 256 位
int256 = np.signedinteger[_256Bit]

# 定义单精度浮点数类型为 80 位
float80 = np.floating[_80Bit]

# 定义双精度浮点数类型为 96 位
float96 = np.floating[_96Bit]

# 定义双精度浮点数类型为 128 位
float128 = np.floating[_128Bit]

# 定义双精度浮点数类型为 256 位
float256 = np.floating[_256Bit]

# 定义复数类型,实部和虚部均为 80 位
complex160 = np.complexfloating[_80Bit, _80Bit]

# 定义复数类型,实部和虚部均为 96 位
complex192 = np.complexfloating[_96Bit, _96Bit]

# 定义复数类型,实部和虚部均为 128 位
complex256 = np.complexfloating[_128Bit, _128Bit]

# 定义复数类型,实部和虚部均为 256 位
complex512 = np.complexfloating[_256Bit, _256Bit]

.\numpy\numpy\_typing\_nbit.py

# 导入必要的模块 `Any`,用于类型提示
from typing import Any

# 下面的变量将由 numpy 的 mypy 插件替换为 `npt.NBitBase` 的子类
# 以下变量分别表示不同精度的整数类型,目前使用 `Any` 占位
_NBitByte: Any  # 一个字节精度的整数
_NBitShort: Any  # 短整型
_NBitIntC: Any  # C 整型
_NBitIntP: Any  # 平台整型
_NBitInt: Any  # 整型
_NBitLong: Any  # 长整型
_NBitLongLong: Any  # 长长整型

# 以下变量分别表示不同精度的浮点数类型,目前使用 `Any` 占位
_NBitHalf: Any  # 半精度浮点数
_NBitSingle: Any  # 单精度浮点数
_NBitDouble: Any  # 双精度浮点数
_NBitLongDouble: Any  # 长双精度浮点数

.\numpy\numpy\_typing\_nested_sequence.py

"""
A module containing the `_NestedSequence` protocol.
"""

# 从未来导入的注解,用于支持类型注解中的递归引用
from __future__ import annotations

# 导入 Iterator 类型用于迭代器定义
from collections.abc import Iterator
# 导入 TypeVar 用于泛型类型变量定义
from typing import (
    Any,
    TypeVar,
    Protocol,
    runtime_checkable,
)

# 将 _NestedSequence 列入模块的公开接口
__all__ = ["_NestedSequence"]

# 定义协变类型变量 _T_co
_T_co = TypeVar("_T_co", covariant=True)


# 声明 _NestedSequence 协议,并标注为运行时可检查的
@runtime_checkable
class _NestedSequence(Protocol[_T_co]):
    """
    A protocol for representing nested sequences.

    Warning
    -------
    `_NestedSequence` currently does not work in combination with typevars,
    *e.g.* ``def func(a: _NestedSequnce[T]) -> T: ...``.

    See Also
    --------
    collections.abc.Sequence
        ABCs for read-only and mutable :term:`sequences`.

    Examples
    --------
    .. code-block:: python

        >>> from __future__ import annotations

        >>> from typing import TYPE_CHECKING
        >>> import numpy as np
        >>> from numpy._typing import _NestedSequence

        >>> def get_dtype(seq: _NestedSequence[float]) -> np.dtype[np.float64]:
        ...     return np.asarray(seq).dtype

        >>> a = get_dtype([1.0])
        >>> b = get_dtype([[1.0]])
        >>> c = get_dtype([[[1.0]]])
        >>> d = get_dtype([[[[1.0]]]])

        >>> if TYPE_CHECKING:
        ...     reveal_locals()
        ...     # note: Revealed local types are:
        ...     # note:     a: numpy.dtype[numpy.floating[numpy._typing._64Bit]]
        ...     # note:     b: numpy.dtype[numpy.floating[numpy._typing._64Bit]]
        ...     # note:     c: numpy.dtype[numpy.floating[numpy._typing._64Bit]]
        ...     # note:     d: numpy.dtype[numpy.floating[numpy._typing._64Bit]]

    """

    # 定义 __len__ 方法,实现 len(self) 功能
    def __len__(self, /) -> int:
        """Implement ``len(self)``."""
        raise NotImplementedError

    # 定义 __getitem__ 方法,实现 self[x] 的功能
    def __getitem__(self, index: int, /) -> _T_co | _NestedSequence[_T_co]:
        """Implement ``self[x]``."""
        raise NotImplementedError

    # 定义 __contains__ 方法,实现 x in self 的功能
    def __contains__(self, x: object, /) -> bool:
        """Implement ``x in self``."""
        raise NotImplementedError

    # 定义 __iter__ 方法,实现 iter(self) 的功能
    def __iter__(self, /) -> Iterator[_T_co | _NestedSequence[_T_co]]:
        """Implement ``iter(self)``."""
        raise NotImplementedError

    # 定义 __reversed__ 方法,实现 reversed(self) 的功能
    def __reversed__(self, /) -> Iterator[_T_co | _NestedSequence[_T_co]]:
        """Implement ``reversed(self)``."""
        raise NotImplementedError

    # 定义 count 方法,返回值的出现次数
    def count(self, value: Any, /) -> int:
        """Return the number of occurrences of `value`."""
        raise NotImplementedError

    # 定义 index 方法,返回值的第一个索引
    def index(self, value: Any, /) -> int:
        """Return the first index of `value`."""
        raise NotImplementedError

.\numpy\numpy\_typing\_scalars.py

# 引入必要的类型声明模块,Union 用于指定多个类型中的一个作为类型注解
from typing import Union, Any

# 引入 NumPy 库,简称为 np
import numpy as np

# 定义 _CharLike_co 类型别名,表示可以是 str 或 bytes 类型的对象
_CharLike_co = Union[str, bytes]

# 下面的六个 `<X>Like_co` 类型别名分别表示可以被强制转换为对应类型 `<X>` 的所有标量类型
# 使用 `same_kind` 规则进行强制转换
_BoolLike_co = Union[bool, np.bool]         # 可以是 bool 或者 np.bool 类型的对象
_UIntLike_co = Union[_BoolLike_co, np.unsignedinteger[Any]]  # 可以是 _BoolLike_co 或 np.unsignedinteger[Any] 类型的对象
_IntLike_co = Union[_BoolLike_co, int, np.integer[Any]]  # 可以是 _BoolLike_co, int 或 np.integer[Any] 类型的对象
_FloatLike_co = Union[_IntLike_co, float, np.floating[Any]]  # 可以是 _IntLike_co, float 或 np.floating[Any] 类型的对象
_ComplexLike_co = Union[_FloatLike_co, complex, np.complexfloating[Any, Any]]  # 可以是 _FloatLike_co, complex 或 np.complexfloating[Any, Any] 类型的对象
_TD64Like_co = Union[_IntLike_co, np.timedelta64]  # 可以是 _IntLike_co 或 np.timedelta64 类型的对象

# 定义 _NumberLike_co 类型别名,表示可以是 int, float, complex, np.number[Any], np.bool 中的一个
_NumberLike_co = Union[int, float, complex, np.number[Any], np.bool]

# 定义 _ScalarLike_co 类型别名,表示可以是 int, float, complex, str, bytes, np.generic 中的一个
_ScalarLike_co = Union[
    int,
    float,
    complex,
    str,
    bytes,
    np.generic,
]

# 定义 _VoidLike_co 类型别名,表示可以是 tuple[Any, ...], np.void 中的一个
# 虽然 _VoidLike_co 不是标量类型,但其用途与标量类型相似
_VoidLike_co = Union[tuple[Any, ...], np.void]

.\numpy\numpy\_typing\_shape.py

# 导入 Sequence 抽象基类,用于定义序列类型的抽象接口
from collections.abc import Sequence
# 导入 Union 和 SupportsIndex 用于类型注解
from typing import Union, SupportsIndex

# 定义 _Shape 类型别名,表示一个由整数组成的元组
_Shape = tuple[int, ...]

# 定义 _ShapeLike 类型别名,表示可以被转换成 _Shape 的对象类型,可以是单个 SupportsIndex 或者 SupportsIndex 组成的序列
# SupportsIndex 表示支持索引操作的类型
_ShapeLike = Union[SupportsIndex, Sequence[SupportsIndex]]

.\numpy\numpy\_typing\_ufunc.pyi

"""
A module with private type-check-only `numpy.ufunc` subclasses.

The signatures of the ufuncs are too varied to reasonably type
with a single class. So instead, `ufunc` has been expanded into
four private subclasses, one for each combination of
`~ufunc.nin` and `~ufunc.nout`.

"""

# 导入必要的模块和类型定义
from typing import (
    Any,
    Generic,
    overload,
    TypeVar,
    Literal,
    SupportsIndex,
    Protocol,
)

# 导入需要的 numpy 类型和对象
from numpy import ufunc, _CastingKind, _OrderKACF
from numpy.typing import NDArray

# 导入私有模块中定义的类型和对象
from ._shape import _ShapeLike
from ._scalars import _ScalarLike_co
from ._array_like import ArrayLike, _ArrayLikeBool_co, _ArrayLikeInt_co
from ._dtype_like import DTypeLike

# 定义类型变量
_T = TypeVar("_T")
_2Tuple = tuple[_T, _T]
_3Tuple = tuple[_T, _T, _T]
_4Tuple = tuple[_T, _T, _T, _T]

# 定义用于泛型约束的类型变量
_NTypes = TypeVar("_NTypes", bound=int)
_IDType = TypeVar("_IDType", bound=Any)
_NameType = TypeVar("_NameType", bound=str)
_Signature = TypeVar("_Signature", bound=str)


class _SupportsArrayUFunc(Protocol):
    # 定义支持 __array_ufunc__ 协议的方法签名
    def __array_ufunc__(
        self,
        ufunc: ufunc,
        method: Literal[
            "__call__", "reduce", "reduceat", "accumulate", "outer", "at"
        ],
        *inputs: Any,
        **kwargs: Any,
    ) -> Any: ...


# NOTE: `reduce`, `accumulate`, `reduceat` and `outer` raise a ValueError for
# ufuncs that don't accept two input arguments and return one output argument.
# In such cases the respective methods are simply typed as `None`.

# NOTE: Similarly, `at` won't be defined for ufuncs that return
# multiple outputs; in such cases `at` is typed as `None`

# NOTE: If 2 output types are returned then `out` must be a
# 2-tuple of arrays. Otherwise `None` or a plain array are also acceptable

class _UFunc_Nin1_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):  # type: ignore[misc]
    # 定义具有 1 个输入和 1 个输出的 ufunc 私有子类
    @property
    def __name__(self) -> _NameType: ...
    @property
    def ntypes(self) -> _NTypes: ...
    @property
    def identity(self) -> _IDType: ...
    @property
    def nin(self) -> Literal[1]: ...
    @property
    def nout(self) -> Literal[1]: ...
    @property
    def nargs(self) -> Literal[2]: ...
    @property
    def signature(self) -> None: ...
    @property
    def reduce(self) -> None: ...
    @property
    def accumulate(self) -> None: ...
    @property
    def reduceat(self) -> None: ...
    @property
    def outer(self) -> None: ...

    # 对 `__call__` 方法进行重载,定义了多种可能的参数和返回类型
    @overload
    def __call__(
        self,
        __x1: _ScalarLike_co,
        out: None = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _2Tuple[None | str] = ...,
    ) -> Any: ...
    @overload
    # 定义一个特殊方法 __call__,使对象能够像函数一样被调用
    def __call__(
        self,
        __x1: ArrayLike,
        out: None | NDArray[Any] | tuple[NDArray[Any]] = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _2Tuple[None | str] = ...,
    ) -> NDArray[Any]: ...
    
    # 重载 __call__ 方法,支持另一种参数类型的调用方式
    @overload
    def __call__(
        self,
        __x1: _SupportsArrayUFunc,
        out: None | NDArray[Any] | tuple[NDArray[Any]] = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _2Tuple[None | str] = ...,
    ) -> Any: ...

    # 定义方法 `at`,用于在数组上执行赋值操作,指定索引位置
    def at(
        self,
        a: _SupportsArrayUFunc,
        indices: _ArrayLikeInt_co,
        /,
    ) -> None: ...
class _UFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):  # type: ignore[misc]
    @property
    def __name__(self) -> _NameType: ...
    @property
    def ntypes(self) -> _NTypes: ...
    @property
    def identity(self) -> _IDType: ...
    @property
    def nin(self) -> Literal[2]: ...
    @property
    def nout(self) -> Literal[1]: ...
    @property
    def nargs(self) -> Literal[3]: ...
    @property
    def signature(self) -> None: ...

    # 第一个重载:处理标量类型参数的函数调用
    @overload
    def __call__(
        self,
        __x1: _ScalarLike_co,
        __x2: _ScalarLike_co,
        out: None = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> Any: ...
    
    # 第二个重载:处理数组类型参数的函数调用
    @overload
    def __call__(
        self,
        __x1: ArrayLike,
        __x2: ArrayLike,
        out: None | NDArray[Any] | tuple[NDArray[Any]] = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> NDArray[Any]: ...

    # 将指定索引处的值更新为给定值
    def at(
        self,
        a: NDArray[Any],
        indices: _ArrayLikeInt_co,
        b: ArrayLike,
        /,
    ) -> None: ...

    # 对数组沿指定轴进行归约操作
    def reduce(
        self,
        array: ArrayLike,
        axis: None | _ShapeLike = ...,
        dtype: DTypeLike = ...,
        out: None | NDArray[Any] = ...,
        keepdims: bool = ...,
        initial: Any = ...,
        where: _ArrayLikeBool_co = ...,
    ) -> Any: ...

    # 对数组沿指定轴进行累加操作
    def accumulate(
        self,
        array: ArrayLike,
        axis: SupportsIndex = ...,
        dtype: DTypeLike = ...,
        out: None | NDArray[Any] = ...,
    ) -> NDArray[Any]: ...

    # 在指定位置执行归约操作
    def reduceat(
        self,
        array: ArrayLike,
        indices: _ArrayLikeInt_co,
        axis: SupportsIndex = ...,
        dtype: DTypeLike = ...,
        out: None | NDArray[Any] = ...,
    ) -> NDArray[Any]: ...

    # 扩展 `**kwargs` 参数为明确的仅关键字参数
    # 第一个重载:处理标量类型参数的外积计算
    @overload
    def outer(
        self,
        A: _ScalarLike_co,
        B: _ScalarLike_co,
        /, *,
        out: None = ...,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> Any: ...
    
    # 第二个重载:处理数组类型参数的外积计算
    @overload
    def outer(  # type: ignore[misc]
        self,
        A: ArrayLike,
        B: ArrayLike,
        /, *,
        out: None | NDArray[Any] | tuple[NDArray[Any]] = ...,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> NDArray[Any]: ...
    # 声明一个函数,该函数接受一些参数并且返回一个NumPy数组
    -> NDArray[Any]: ...
class _UFunc_Nin1_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]):  # type: ignore[misc]
    # 定义一个类,表示一个具有1个输入和2个输出的通用函数(ufunc),泛型参数包括名称类型、输入类型和标识类型

    @property
    def __name__(self) -> _NameType: ...
    # 返回函数名称,类型为泛型参数 _NameType

    @property
    def ntypes(self) -> _NTypes: ...
    # 返回函数可处理的输入数据类型,类型为泛型参数 _NTypes

    @property
    def identity(self) -> _IDType: ...
    # 返回函数的标识元素,类型为泛型参数 _IDType

    @property
    def nin(self) -> Literal[1]: ...
    # 返回函数的输入数量,固定为1

    @property
    def nout(self) -> Literal[2]: ...
    # 返回函数的输出数量,固定为2

    @property
    def nargs(self) -> Literal[3]: ...
    # 返回函数的参数数量,固定为3

    @property
    def signature(self) -> None: ...
    # 返回函数的签名信息,但此处返回类型为 None,可能未实现具体的签名功能

    @property
    def at(self) -> None: ...
    # 返回函数的 at 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def reduce(self) -> None: ...
    # 返回函数的 reduce 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def accumulate(self) -> None: ...
    # 返回函数的 accumulate 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def reduceat(self) -> None: ...
    # 返回函数的 reduceat 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def outer(self) -> None: ...
    # 返回函数的 outer 方法,但此处返回类型为 None,可能未实现具体的功能

    @overload
    def __call__(
        self,
        __x1: _ScalarLike_co,
        __out1: None = ...,
        __out2: None = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> _2Tuple[Any]: ...
    # 定义 __call__ 方法的重载,用于处理标量输入 __x1,返回一个包含两个元素的元组

    @overload
    def __call__(
        self,
        __x1: ArrayLike,
        __out1: None | NDArray[Any] = ...,
        __out2: None | NDArray[Any] = ...,
        *,
        out: _2Tuple[NDArray[Any]] = ...,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> _2Tuple[NDArray[Any]]: ...
    # 定义 __call__ 方法的重载,用于处理数组类型输入 __x1,返回一个包含两个元素的元组,支持输出参数

    @overload
    def __call__(
        self,
        __x1: _SupportsArrayUFunc,
        __out1: None | NDArray[Any] = ...,
        __out2: None | NDArray[Any] = ...,
        *,
        out: _2Tuple[NDArray[Any]] = ...,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
    ) -> _2Tuple[Any]: ...
    # 定义 __call__ 方法的重载,用于处理支持 ufunc 的数组类型输入 __x1,返回一个包含两个元素的元组

class _UFunc_Nin2_Nout2(ufunc, Generic[_NameType, _NTypes, _IDType]):  # type: ignore[misc]
    # 定义一个类,表示一个具有2个输入和2个输出的通用函数(ufunc),泛型参数包括名称类型、输入类型和标识类型

    @property
    def __name__(self) -> _NameType: ...
    # 返回函数名称,类型为泛型参数 _NameType

    @property
    def ntypes(self) -> _NTypes: ...
    # 返回函数可处理的输入数据类型,类型为泛型参数 _NTypes

    @property
    def identity(self) -> _IDType: ...
    # 返回函数的标识元素,类型为泛型参数 _IDType

    @property
    def nin(self) -> Literal[2]: ...
    # 返回函数的输入数量,固定为2

    @property
    def nout(self) -> Literal[2]: ...
    # 返回函数的输出数量,固定为2

    @property
    def nargs(self) -> Literal[4]: ...
    # 返回函数的参数数量,固定为4

    @property
    def signature(self) -> None: ...
    # 返回函数的签名信息,但此处返回类型为 None,可能未实现具体的签名功能

    @property
    def at(self) -> None: ...
    # 返回函数的 at 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def reduce(self) -> None: ...
    # 返回函数的 reduce 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def accumulate(self) -> None: ...
    # 返回函数的 accumulate 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def reduceat(self) -> None: ...
    # 返回函数的 reduceat 方法,但此处返回类型为 None,可能未实现具体的功能

    @property
    def outer(self) -> None: ...
    # 返回函数的 outer 方法,但此处返回类型为 None,可能未实现具体的功能

    @overload
    # 以下省略部分重载定义,但均符合上述类似的结构
    # 定义一个方法重载,用于接受标量参数,并返回两个任意类型的值的元组
    def __call__(
        self,
        __x1: _ScalarLike_co,
        __x2: _ScalarLike_co,
        __out1: None = ...,
        __out2: None = ...,
        *,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _4Tuple[None | str] = ...,
    ) -> _2Tuple[Any]: ...

    # 方法重载,用于接受数组参数,并返回两个 NDArray[Any] 类型的值的元组
    @overload
    def __call__(
        self,
        __x1: ArrayLike,
        __x2: ArrayLike,
        __out1: None | NDArray[Any] = ...,
        __out2: None | NDArray[Any] = ...,
        *,
        out: _2Tuple[NDArray[Any]] = ...,
        where: None | _ArrayLikeBool_co = ...,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _4Tuple[None | str] = ...,
    ) -> _2Tuple[NDArray[Any]]: ...
# 定义一个私有类 _GUFunc_Nin2_Nout1,继承自 ufunc 泛型类,支持泛型类型 _NameType、_NTypes、_IDType 和 _Signature
class _GUFunc_Nin2_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType, _Signature]):  # type: ignore[misc]

    # 返回属性 __name__,类型为 _NameType,表示函数名或操作名称
    @property
    def __name__(self) -> _NameType: ...

    # 返回属性 ntypes,类型为 _NTypes,表示函数适用的数据类型
    @property
    def ntypes(self) -> _NTypes: ...

    # 返回属性 identity,类型为 _IDType,表示函数的身份元素
    @property
    def identity(self) -> _IDType: ...

    # 返回属性 nin,类型为 Literal[2],表示函数接受的参数个数为两个
    @property
    def nin(self) -> Literal[2]: ...

    # 返回属性 nout,类型为 Literal[1],表示函数返回的参数个数为一个
    @property
    def nout(self) -> Literal[1]: ...

    # 返回属性 nargs,类型为 Literal[3],表示函数期望的参数个数为三个
    @property
    def nargs(self) -> Literal[3]: ...

    # 返回属性 signature,类型为 _Signature,表示函数的签名信息
    @property
    def signature(self) -> _Signature: ...

    # 返回属性 reduce,类型为 None,表示此函数不支持 reduce 操作
    @property
    def reduce(self) -> None: ...

    # 返回属性 accumulate,类型为 None,表示此函数不支持 accumulate 操作
    @property
    def accumulate(self) -> None: ...

    # 返回属性 reduceat,类型为 None,表示此函数不支持 reduceat 操作
    @property
    def reduceat(self) -> None: ...

    # 返回属性 outer,类型为 None,表示此函数不支持 outer 操作
    @property
    def outer(self) -> None: ...

    # 返回属性 at,类型为 None,表示此函数不支持 at 操作
    @property
    def at(self) -> None: ...

    # 重载函数调用操作,处理一维数组的标量情况;如果是多维数组,则返回 ndarray 类型
    @overload
    def __call__(
        self,
        __x1: ArrayLike,
        __x2: ArrayLike,
        out: None = ...,
        *,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
        axes: list[_2Tuple[SupportsIndex]] = ...,
    ) -> Any: ...

    # 重载函数调用操作,处理一维数组的标量情况,并指定输出为 NDArray[Any] 或其元组
    @overload
    def __call__(
        self,
        __x1: ArrayLike,
        __x2: ArrayLike,
        out: NDArray[Any] | tuple[NDArray[Any]],
        *,
        casting: _CastingKind = ...,
        order: _OrderKACF = ...,
        dtype: DTypeLike = ...,
        subok: bool = ...,
        signature: str | _3Tuple[None | str] = ...,
        axes: list[_2Tuple[SupportsIndex]] = ...,
    ) -> NDArray[Any]: ...

.\numpy\numpy\_typing\__init__.py

# 导入 `numpy.typing` 的私有模块。
from __future__ import annotations

# 导入 `ufunc` 模块。
from .. import ufunc

# 导入 `_utils` 模块中的 `set_module` 函数。
from .._utils import set_module

# 导入 `TYPE_CHECKING` 常量和 `final` 装饰器。
from typing import TYPE_CHECKING, final

# 使用 `@final` 装饰器,限制了不能创建任意的 `NBitBase` 子类。
@final
# 设置模块为 "numpy.typing"
@set_module("numpy.typing")
class NBitBase:
    """
    用于静态类型检查期间表示 `numpy.number` 精度的类型。

    仅用于静态类型检查,`NBitBase` 表示一个层级子类的基类。
    每个后续的子类用于表示更低精度的层级,例如 `64Bit > 32Bit > 16Bit`。

    .. versionadded:: 1.20

    Examples
    --------
    下面是一个典型的用法示例:`NBitBase` 用于注释一个函数,该函数接受任意精度的浮点数和整数作为参数,
    并返回最大精度的新浮点数(例如 `np.float16 + np.int64 -> np.float64`)。
    """

    # 检查是否子类的名称符合允许的命名规则
    def __init_subclass__(cls) -> None:
        # 允许的类名集合
        allowed_names = {
            "NBitBase", "_256Bit", "_128Bit", "_96Bit", "_80Bit",
            "_64Bit", "_32Bit", "_16Bit", "_8Bit",
        }
        # 如果子类的名称不在允许的名称集合中,则抛出错误
        if cls.__name__ not in allowed_names:
            raise TypeError('cannot inherit from final class "NBitBase"')
        # 调用父类的初始化子类方法
        super().__init_subclass__()

# 禁止关于继承了 `@final` 装饰器类的子类化错误
class _256Bit(NBitBase):  # type: ignore[misc]
    pass

class _128Bit(_256Bit):  # type: ignore[misc]
    pass

class _96Bit(_128Bit):  # type: ignore[misc]
    pass

class _80Bit(_96Bit):  # type: ignore[misc]
    pass

class _64Bit(_80Bit):  # type: ignore[misc]
    pass

class _32Bit(_64Bit):  # type: ignore[misc]
    pass

class _16Bit(_32Bit):  # type: ignore[misc]
    pass

class _8Bit(_16Bit):  # type: ignore[misc]
    pass

# 导入 `_nested_sequence` 模块中的 `_NestedSequence` 类。
from ._nested_sequence import (
    _NestedSequence as _NestedSequence,
)

# 导入 `_nbit` 模块中的一系列 `_NBit*` 类。
from ._nbit import (
    _NBitByte as _NBitByte,
    _NBitShort as _NBitShort,
    _NBitIntC as _NBitIntC,
    _NBitIntP as _NBitIntP,
    _NBitInt as _NBitInt,
    _NBitLong as _NBitLong,
    _NBitLongLong as _NBitLongLong,
    _NBitHalf as _NBitHalf,
)
    # 导入模块中的 _NBitSingle 别名为 _NBitSingle
    _NBitSingle as _NBitSingle,
    # 导入模块中的 _NBitDouble 别名为 _NBitDouble
    _NBitDouble as _NBitDouble,
    # 导入模块中的 _NBitLongDouble 别名为 _NBitLongDouble
    _NBitLongDouble as _NBitLongDouble,
# 从._char_codes模块导入以下变量作为别名
from ._char_codes import (
    _BoolCodes as _BoolCodes,  # 布尔类型的字符编码
    _UInt8Codes as _UInt8Codes,  # 无符号8位整数的字符编码
    _UInt16Codes as _UInt16Codes,  # 无符号16位整数的字符编码
    _UInt32Codes as _UInt32Codes,  # 无符号32位整数的字符编码
    _UInt64Codes as _UInt64Codes,  # 无符号64位整数的字符编码
    _Int8Codes as _Int8Codes,  # 有符号8位整数的字符编码
    _Int16Codes as _Int16Codes,  # 有符号16位整数的字符编码
    _Int32Codes as _Int32Codes,  # 有符号32位整数的字符编码
    _Int64Codes as _Int64Codes,  # 有符号64位整数的字符编码
    _Float16Codes as _Float16Codes,  # 16位浮点数的字符编码
    _Float32Codes as _Float32Codes,  # 32位浮点数的字符编码
    _Float64Codes as _Float64Codes,  # 64位浮点数的字符编码
    _Complex64Codes as _Complex64Codes,  # 64位复数的字符编码
    _Complex128Codes as _Complex128Codes,  # 128位复数的字符编码
    _ByteCodes as _ByteCodes,  # 字节的字符编码
    _ShortCodes as _ShortCodes,  # 短整数的字符编码
    _IntCCodes as _IntCCodes,  # C语言整数的字符编码
    _IntPCodes as _IntPCodes,  # 平台相关整数的字符编码
    _IntCodes as _IntCodes,  # 整数的字符编码
    _LongCodes as _LongCodes,  # 长整数的字符编码
    _LongLongCodes as _LongLongCodes,  # 长长整数的字符编码
    _UByteCodes as _UByteCodes,  # 无符号字节的字符编码
    _UShortCodes as _UShortCodes,  # 无符号短整数的字符编码
    _UIntCCodes as _UIntCCodes,  # 无符号C语言整数的字符编码
    _UIntPCodes as _UIntPCodes,  # 无符号平台相关整数的字符编码
    _UIntCodes as _UIntCodes,  # 无符号整数的字符编码
    _ULongCodes as _ULongCodes,  # 无符号长整数的字符编码
    _ULongLongCodes as _ULongLongCodes,  # 无符号长长整数的字符编码
    _HalfCodes as _HalfCodes,  # 半精度浮点数的字符编码
    _SingleCodes as _SingleCodes,  # 单精度浮点数的字符编码
    _DoubleCodes as _DoubleCodes,  # 双精度浮点数的字符编码
    _LongDoubleCodes as _LongDoubleCodes,  # 长双精度浮点数的字符编码
    _CSingleCodes as _CSingleCodes,  # C语言单精度浮点数的字符编码
    _CDoubleCodes as _CDoubleCodes,  # C语言双精度浮点数的字符编码
    _CLongDoubleCodes as _CLongDoubleCodes,  # C语言长双精度浮点数的字符编码
    _DT64Codes as _DT64Codes,  # datetime64类型的字符编码
    _TD64Codes as _TD64Codes,  # timedelta64类型的字符编码
    _StrCodes as _StrCodes,  # 字符串的字符编码
    _BytesCodes as _BytesCodes,  # 字节串的字符编码
    _VoidCodes as _VoidCodes,  # 空类型的字符编码
    _ObjectCodes as _ObjectCodes,  # 对象类型的字符编码
)

# 从._scalars模块导入以下变量作为别名
from ._scalars import (
    _CharLike_co as _CharLike_co,  # 类似字符的协变类型的字符编码
    _BoolLike_co as _BoolLike_co,  # 类似布尔值的协变类型的字符编码
    _UIntLike_co as _UIntLike_co,  # 类似无符号整数的协变类型的字符编码
    _IntLike_co as _IntLike_co,  # 类似有符号整数的协变类型的字符编码
    _FloatLike_co as _FloatLike_co,  # 类似浮点数的协变类型的字符编码
    _ComplexLike_co as _ComplexLike_co,  # 类似复数的协变类型的字符编码
    _TD64Like_co as _TD64Like_co,  # 类似timedelta64的协变类型的字符编码
    _NumberLike_co as _NumberLike_co,  # 类似数字的协变类型的字符编码
    _ScalarLike_co as _ScalarLike_co,  # 类似标量的协变类型的字符编码
    _VoidLike_co as _VoidLike_co,  # 类似空类型的协变类型的字符编码
)

# 从._shape模块导入以下变量作为别名
from ._shape import (
    _Shape as _Shape,  # 形状的字符编码
    _ShapeLike as _ShapeLike,  # 类似形状的字符编码
)

# 从._dtype_like模块导入以下变量作为别名
from ._dtype_like import (
    DTypeLike as DTypeLike,  # 类似数据类型的字符编码
    _DTypeLike as _DTypeLike,  # 数据类型的字符编码
    _SupportsDType as _SupportsDType,  # 支持数据类型的字符编码
    _VoidDTypeLike as _VoidDTypeLike,  # 类似空数据类型的字符编码
    _DTypeLikeBool as _DTypeLikeBool,  # 类似布尔数据类型的字符编码
    _DTypeLikeUInt as _DTypeLikeUInt,  # 类似无符号整数数据类型的字符编码
    _DTypeLikeInt as _DTypeLikeInt,  # 类似有符号整数数据类型的字符编码
    _DTypeLikeFloat as _DTypeLikeFloat,  # 类似浮点数数据类型的字符编码
    _DTypeLikeComplex as _DTypeLikeComplex,  # 类似复数数据类型的字符编码
    _DTypeLikeTD64 as _DTypeLikeTD64,  # 类似timedelta64数据类型的字符编码
    _DTypeLikeDT64 as _DTypeLikeDT64,  # 类似datetime64数据类型的字符编码
    _DTypeLikeObject as _DTypeLikeObject,  # 类似对象数据类型的字符编码
    _DTypeLikeVoid as _DTypeLikeVoid,  # 类似空数据类型的字符编码
    _DTypeLikeStr as _DTypeLikeStr,  # 类似字符串数据类型的字符编码
    _DTypeLikeBytes as _DTypeLikeBytes,  # 类似字节串数据类型的字符编码
    _DTypeLikeComplex_co as _DTypeLikeComplex_co,  # 类似复数的协变类型的数据类型的字符编码
)

# 从._array_like模块导入以下变量作为别名
from ._array_like import (
    NDArray as NDArray,  # N维数组的字符编码
    ArrayLike as ArrayLike,  # 类似数组的字符编码
    _ArrayLike as _ArrayLike,  # 数组的字符编码
    _FiniteNestedSequence as _FiniteNestedSequence,  # 有限嵌套序列的字符编码
    _SupportsArray as _SupportsArray,  # 支持数组的字符编码
    _SupportsArrayFunc as _SupportsArrayFunc,  # 支持数组函数的字符编码
    _ArrayLikeInt as _ArrayLikeInt,  # 类似整数数组的字符编码
    _Array
    _ArrayLikeComplex_co as _ArrayLikeComplex_co,
    _ArrayLikeNumber_co as _ArrayLikeNumber_co,
    _ArrayLikeTD64_co as _ArrayLikeTD64_co,
    _ArrayLikeDT64_co as _ArrayLikeDT64_co,
    _ArrayLikeObject_co as _ArrayLikeObject_co,
    _ArrayLikeVoid_co as _ArrayLikeVoid_co,
    _ArrayLikeStr_co as _ArrayLikeStr_co,
    _ArrayLikeBytes_co as _ArrayLikeBytes_co,
    _ArrayLikeUnknown as _ArrayLikeUnknown,
    _UnknownType as _UnknownType,



# 定义类型别名,用于类型注解和提示
_ArrayLikeComplex_co as _ArrayLikeComplex_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeNumber_co as _ArrayLikeNumber_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeTD64_co as _ArrayLikeTD64_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeDT64_co as _ArrayLikeDT64_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeObject_co as _ArrayLikeObject_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeVoid_co as _ArrayLikeVoid_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeStr_co as _ArrayLikeStr_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeBytes_co as _ArrayLikeBytes_co,
# 定义类型别名,用于类型注解和提示
_ArrayLikeUnknown as _ArrayLikeUnknown,
# 定义类型别名,用于类型注解和提示
_UnknownType as _UnknownType,
if TYPE_CHECKING:
    # 如果是类型检查阶段,导入特定的 _ufunc 模块中的几个 ufunc 子类
    from ._ufunc import (
        _UFunc_Nin1_Nout1 as _UFunc_Nin1_Nout1,
        _UFunc_Nin2_Nout1 as _UFunc_Nin2_Nout1,
        _UFunc_Nin1_Nout2 as _UFunc_Nin1_Nout2,
        _UFunc_Nin2_Nout2 as _UFunc_Nin2_Nout2,
        _GUFunc_Nin2_Nout1 as _GUFunc_Nin2_Nout1,
    )
else:
    # 如果不是类型检查阶段,在运行时将 ufunc 子类声明为 ufunc 的别名
    # 这有助于像 Jedi 这样的自动补全工具 (numpy/numpy#19834)
    _UFunc_Nin1_Nout1 = ufunc
    _UFunc_Nin2_Nout1 = ufunc
    _UFunc_Nin1_Nout2 = ufunc
    _UFunc_Nin2_Nout2 = ufunc
    _GUFunc_Nin2_Nout1 = ufunc

.\numpy\numpy\_utils\_convertions.py

"""
A set of methods retained from np.compat module that
are still used across codebase.
"""

# 定义导出的方法名列表,这些方法在代码库中仍然被使用
__all__ = ["asunicode", "asbytes"]

# 定义将字节流转换为 Unicode 字符串的方法
def asunicode(s):
    # 如果输入是字节流,则用 Latin-1 解码为 Unicode 字符串
    if isinstance(s, bytes):
        return s.decode('latin1')
    # 如果输入不是字节流,直接转换为字符串并返回
    return str(s)

# 定义将输入转换为字节流的方法
def asbytes(s):
    # 如果输入已经是字节流,直接返回
    if isinstance(s, bytes):
        return s
    # 如果输入不是字节流,将其转换为 Latin-1 编码的字节流并返回
    return str(s).encode('latin1')

.\numpy\numpy\_utils\_inspect.py

"""
Subset of inspect module from upstream python

We use this instead of upstream because upstream inspect is slow to import, and
significantly contributes to numpy import times. Importing this copy has almost
no overhead.

"""
# 导入 types 模块,用于类型检查
import types

# 定义模块公开的函数和变量
__all__ = ['getargspec', 'formatargspec']

# ----------------------------------------------------------- type-checking
def ismethod(object):
    """Return true if the object is an instance method.

    Instance method objects provide these attributes:
        __doc__         documentation string
        __name__        name with which this method was defined
        im_class        class object in which this method belongs
        im_func         function object containing implementation of method
        im_self         instance to which this method is bound, or None

    """
    # 判断对象是否为方法类型(MethodType)
    return isinstance(object, types.MethodType)

def isfunction(object):
    """Return true if the object is a user-defined function.

    Function objects provide these attributes:
        __doc__         documentation string
        __name__        name with which this function was defined
        func_code       code object containing compiled function bytecode
        func_defaults   tuple of any default values for arguments
        func_doc        (same as __doc__)
        func_globals    global namespace in which this function was defined
        func_name       (same as __name__)

    """
    # 判断对象是否为函数类型(FunctionType)
    return isinstance(object, types.FunctionType)

def iscode(object):
    """Return true if the object is a code object.

    Code objects provide these attributes:
        co_argcount     number of arguments (not including * or ** args)
        co_code         string of raw compiled bytecode
        co_consts       tuple of constants used in the bytecode
        co_filename     name of file in which this code object was created
        co_firstlineno  number of first line in Python source code
        co_flags        bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
        co_lnotab       encoded mapping of line numbers to bytecode indices
        co_name         name with which this code object was defined
        co_names        tuple of names of local variables
        co_nlocals      number of local variables
        co_stacksize    virtual machine stack space required
        co_varnames     tuple of names of arguments and local variables
        
    """
    # 判断对象是否为代码对象(CodeType)
    return isinstance(object, types.CodeType)

# ------------------------------------------------ argument list extraction
# These constants are from Python's compile.h.
# 定义一些与编译相关的常量,来源于 Python 的 compile.h 文件
CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS = 1, 2, 4, 8

def getargs(co):
    """Get information about the arguments accepted by a code object.

    Three things are returned: (args, varargs, varkw), where 'args' is
    a list of argument names (possibly containing nested lists), and
    'varargs' and 'varkw' are the names of the * and ** arguments or None.

    """
    # 获取代码对象(code object)的参数信息
    # 返回一个包含参数名列表的元组 (args, varargs, varkw),其中:
    # - args 是参数名列表(可能包含嵌套列表)
    # - varargs 是 * 参数的名称或 None
    # - varkw 是 ** 参数的名称或 None
    # 如果给定的参数 `co` 不是代码对象,则抛出类型错误异常
    if not iscode(co):
        raise TypeError('arg is not a code object')

    # 获取代码对象中的参数数量
    nargs = co.co_argcount
    # 获取代码对象中的局部变量名列表
    names = co.co_varnames
    # 提取参数列表(前 nargs 个变量名)
    args = list(names[:nargs])

    # 以下部分的处理是为了处理匿名的(元组)参数。
    # 我们不需要支持这种情况,因此移除以避免引入 dis 模块。
    for i in range(nargs):
        # 如果参数名以空字符或点号开头,则抛出类型错误异常
        if args[i][:1] in ['', '.']:
            raise TypeError("tuple function arguments are not supported")
    
    varargs = None
    # 如果代码对象的标志位 CO_VARARGS 被设置
    if co.co_flags & CO_VARARGS:
        # 获取可变位置参数的变量名
        varargs = co.co_varnames[nargs]
        # 参数数量加一,以包括可变位置参数
        nargs = nargs + 1
    
    varkw = None
    # 如果代码对象的标志位 CO_VARKEYWORDS 被设置
    if co.co_flags & CO_VARKEYWORDS:
        # 获取可变关键字参数的变量名
        varkw = co.co_varnames[nargs]
    
    # 返回提取的参数列表、可变位置参数名和可变关键字参数名
    return args, varargs, varkw
# 获取函数参数的名称和默认值信息

def getargspec(func):
    """Get the names and default values of a function's arguments.

    A tuple of four things is returned: (args, varargs, varkw, defaults).
    'args' is a list of the argument names (it may contain nested lists).
    'varargs' and 'varkw' are the names of the * and ** arguments or None.
    'defaults' is an n-tuple of the default values of the last n arguments.

    """

    # 如果传入的函数是方法,则获取其函数对象
    if ismethod(func):
        func = func.__func__
    
    # 如果传入的不是函数对象,则抛出类型错误
    if not isfunction(func):
        raise TypeError('arg is not a Python function')
    
    # 使用函数对象的字节码获取参数的详细信息
    args, varargs, varkw = getargs(func.__code__)
    
    # 返回参数名称列表、*args 和 **kwargs 的名称、以及最后 n 个参数的默认值
    return args, varargs, varkw, func.__defaults__


# 获取特定帧中传入参数的信息

def getargvalues(frame):
    """Get information about arguments passed into a particular frame.

    A tuple of four things is returned: (args, varargs, varkw, locals).
    'args' is a list of the argument names (it may contain nested lists).
    'varargs' and 'varkw' are the names of the * and ** arguments or None.
    'locals' is the locals dictionary of the given frame.
    
    """
    # 使用帧对象的字节码获取参数的详细信息
    args, varargs, varkw = getargs(frame.f_code)
    
    # 返回参数名称列表、*args 和 **kwargs 的名称、以及当前帧的局部变量字典
    return args, varargs, varkw, frame.f_locals


# 将序列连接成字符串表示

def joinseq(seq):
    """Join sequence elements into a string, handling single element case.

    """
    # 如果序列只有一个元素,则返回带括号的字符串表示
    if len(seq) == 1:
        return '(' + seq[0] + ',)'
    else:
        # 否则,使用逗号连接序列中的元素,并添加括号
        return '(' + ', '.join(seq) + ')'


# 递归地将序列中的元素转换为字符串表示

def strseq(object, convert, join=joinseq):
    """Recursively walk a sequence, stringifying each element.

    """
    # 如果对象的类型是列表或元组,则递归地将每个元素转换为字符串
    if type(object) in [list, tuple]:
        return join([strseq(_o, convert, join) for _o in object])
    else:
        # 否则,使用给定的转换函数将对象转换为字符串
        return convert(object)


# 格式化函数参数规范

def formatargspec(args, varargs=None, varkw=None, defaults=None,
                  formatarg=str,
                  formatvarargs=lambda name: '*' + name,
                  formatvarkw=lambda name: '**' + name,
                  formatvalue=lambda value: '=' + repr(value),
                  join=joinseq):
    """Format an argument spec from the 4 values returned by getargspec.

    The first four arguments are (args, varargs, varkw, defaults).  The
    other four arguments are the corresponding optional formatting functions
    that are called to turn names and values into strings.  The ninth
    argument is an optional function to format the sequence of arguments.

    """
    # 初始化一个空列表用于存放格式化后的参数规范
    specs = []
    
    # 如果存在默认值,则计算第一个默认参数的索引
    if defaults:
        firstdefault = len(args) - len(defaults)
    
    # 遍历参数列表,逐个格式化成字符串并添加到列表中
    for i in range(len(args)):
        spec = strseq(args[i], formatarg, join)
        if defaults and i >= firstdefault:
            spec = spec + formatvalue(defaults[i - firstdefault])
        specs.append(spec)
    
    # 如果存在 *args 参数,则将其格式化并添加到列表中
    if varargs is not None:
        specs.append(formatvarargs(varargs))
    
    # 如果存在 **kwargs 参数,则将其格式化并添加到列表中
    if varkw is not None:
        specs.append(formatvarkw(varkw))
    
    # 使用指定的连接函数将所有参数规范连接成一个字符串
    return '(' + ', '.join(specs) + ')'


# 格式化函数参数值

def formatargvalues(args, varargs, varkw, locals,
                    formatarg=str,
                    formatvarargs=lambda name: '*' + name,
                    formatvarkw=lambda name: '**' + name,
                    formatvalue=lambda value: '=' + repr(value),
                    join=joinseq):
    """
    根据从 getargvalues 返回的四个值格式化参数规范。

    前四个参数是 (args, varargs, varkw, locals)。接下来四个参数是相应的可选格式化函数,
    用于将名称和值转换为字符串。第九个参数是一个可选的函数,用于格式化参数序列。

    """
    # 定义一个转换函数 convert,接受名称 name 和 locals 参数,默认使用 formatarg 和 formatvalue 函数进行格式化
    def convert(name, locals=locals,
                formatarg=formatarg, formatvalue=formatvalue):
        # 返回格式化后的参数名称和对应值
        return formatarg(name) + formatvalue(locals[name])
    
    # 通过列表推导式,对 args 中的每个参数调用 strseq 函数,并使用 convert 函数进行格式化,最后使用 join 函数连接成字符串
    specs = [strseq(arg, convert, join) for arg in args]

    # 如果存在可变位置参数 varargs,则将其格式化并添加到 specs 列表中
    if varargs:
        specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
    
    # 如果存在可变关键字参数 varkw,则将其格式化并添加到 specs 列表中
    if varkw:
        specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
    
    # 返回格式化后的参数列表,使用逗号和空格连接成一个字符串,并在两侧添加括号
    return '(' + ', '.join(specs) + ')'

.\numpy\numpy\_utils\_pep440.py

"""Utility to compare pep440 compatible version strings.

The LooseVersion and StrictVersion classes that distutils provides don't
work; they don't recognize anything like alpha/beta/rc/dev versions.
"""

# Copyright (c) Donald Stufft and individual contributors.
# All rights reserved.

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:

#     1. Redistributions of source code must retain the above copyright notice,
#        this list of conditions and the following disclaimer.

#     2. Redistributions in binary form must reproduce the above copyright
#        notice, this list of conditions and the following disclaimer in the
#        documentation and/or other materials provided with the distribution.

# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

import collections
import itertools
import re

# 定义模块导出的公共接口
__all__ = [
    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN",
]

# BEGIN packaging/_structures.py

# 定义无穷大的类
class Infinity:
    def __repr__(self):
        return "Infinity"

    def __hash__(self):
        return hash(repr(self))

    def __lt__(self, other):
        return False

    def __le__(self, other):
        return False

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not isinstance(other, self.__class__)

    def __gt__(self, other):
        return True

    def __ge__(self, other):
        return True

    def __neg__(self):
        return NegativeInfinity

# 定义负无穷大的类
Infinity = Infinity()

# 定义负无穷大的类
class NegativeInfinity:
    def __repr__(self):
        return "-Infinity"

    def __hash__(self):
        return hash(repr(self))

    def __lt__(self, other):
        return True

    def __le__(self, other):
        return True

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not isinstance(other, self.__class__)

    def __gt__(self, other):
        return False

    def __ge__(self, other):
        return False

    def __neg__(self):
        return Infinity

# BEGIN packaging/version.py

# 载入负无穷大类的别名
NegativeInfinity = NegativeInfinity()

# 使用 collections 模块的 namedtuple 定义版本元组结构
_Version = collections.namedtuple(
    "_Version",
    # 字符串 "_Version",可能用作某种标识或关键字
    ["epoch", "release", "dev", "pre", "post", "local"],
    # 包含了多个字符串的列表,这些字符串可能代表软件版本的不同部分或阶段
def parse(version):
    """
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    """
    try:
        # 尝试使用给定的版本字符串创建一个 Version 对象
        return Version(version)
    except InvalidVersion:
        # 如果版本字符串无效,则创建一个 LegacyVersion 对象
        return LegacyVersion(version)


class InvalidVersion(ValueError):
    """
    An invalid version was found, users should refer to PEP 440.
    """


class _BaseVersion:

    def __hash__(self):
        # 返回对象的哈希值,使用 _key 属性
        return hash(self._key)

    def __lt__(self, other):
        # 比较当前对象是否小于另一个对象,使用 _compare 方法进行比较
        return self._compare(other, lambda s, o: s < o)

    def __le__(self, other):
        # 比较当前对象是否小于等于另一个对象,使用 _compare 方法进行比较
        return self._compare(other, lambda s, o: s <= o)

    def __eq__(self, other):
        # 比较当前对象是否等于另一个对象,使用 _compare 方法进行比较
        return self._compare(other, lambda s, o: s == o)

    def __ge__(self, other):
        # 比较当前对象是否大于等于另一个对象,使用 _compare 方法进行比较
        return self._compare(other, lambda s, o: s >= o)

    def __gt__(self, other):
        # 比较当前对象是否大于另一个对象,使用 _compare 方法进行比较
        return self._compare(other, lambda s, o: s > o)

    def __ne__(self, other):
        # 比较当前对象是否不等于另一个对象,使用 _compare 方法进行比较
        return self._compare(other, lambda s, o: s != o)

    def _compare(self, other, method):
        # 通用比较方法,接受另一个对象和一个比较函数作为参数,用于比较 _key 属性
        if not isinstance(other, _BaseVersion):
            return NotImplemented

        return method(self._key, other._key)


class LegacyVersion(_BaseVersion):

    def __init__(self, version):
        # 初始化 LegacyVersion 对象,接受版本字符串作为参数,并生成 _key 属性
        self._version = str(version)
        self._key = _legacy_cmpkey(self._version)

    def __str__(self):
        # 返回 LegacyVersion 对象的字符串表示形式,即版本字符串
        return self._version

    def __repr__(self):
        # 返回 LegacyVersion 对象的详细字符串表示形式,用于调试和显示
        return "<LegacyVersion({0})>".format(repr(str(self)))

    @property
    def public(self):
        # 返回 LegacyVersion 对象的公共版本号(即版本字符串)
        return self._version

    @property
    def base_version(self):
        # 返回 LegacyVersion 对象的基础版本号(即版本字符串)
        return self._version

    @property
    def local(self):
        # 返回 LegacyVersion 对象的本地版本号,对于 LegacyVersion 永远为 None
        return None

    @property
    def is_prerelease(self):
        # 返回 LegacyVersion 对象是否为预发布版本,对于 LegacyVersion 永远为 False
        return False

    @property
    def is_postrelease(self):
        # 返回 LegacyVersion 对象是否为发布后版本,对于 LegacyVersion 永远为 False
        return False


_legacy_version_component_re = re.compile(
    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
)

_legacy_version_replacement_map = {
    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
}


def _parse_version_parts(s):
    # 解析版本字符串,返回版本组件的生成器
    for part in _legacy_version_component_re.split(s):
        part = _legacy_version_replacement_map.get(part, part)

        if not part or part == ".":
            continue

        if part[:1] in "0123456789":
            # 对于数字开头的部分,进行填充以便进行数字比较
            yield part.zfill(8)
        else:
            # 对于非数字开头的部分,添加通配符以确保正确排序
            yield "*" + part

    # 确保 alpha/beta/candidate 在 final 之前排序
    yield "*final"


def _legacy_cmpkey(version):
    # 在这里固定使用 -1 作为 epoch。PEP 440 的版本只能使用大于等于 0 的 epoch。
    # 这将有效地将 LegacyVersion,使用 setuptools 最初实现的标准,放在所有 PEP 440 版本之前。
    epoch = -1

    # 此方案来自 pkg_resources.parse_version,在其采用 packaging 库之前,使用的是这种方案。
    parts = []
    # 对版本号进行分割并转换为小写,返回每个部分的迭代器
    for part in _parse_version_parts(version.lower()):
        # 如果部分以 "*" 开头
        if part.startswith("*"):
            # 如果该部分小于 "*final",则移除在预发布标签之前的 "-"
            if part < "*final":
                # 移除最后一个元素为 "*final-" 的所有元素
                while parts and parts[-1] == "*final-":
                    parts.pop()

            # 移除每个数字部分系列末尾的零
            while parts and parts[-1] == "00000000":
                parts.pop()

        # 将处理过的部分添加到列表中
        parts.append(part)
    
    # 将列表转换为元组
    parts = tuple(parts)

    # 返回版本号的 epoch 和处理后的 parts
    return epoch, parts
# 定义版本号匹配模式,用于解析和验证版本号字符串的格式
VERSION_PATTERN = r"""
    v?                                                  # 可选的 'v' 前缀
    (?:
        (?:(?P<epoch>[0-9]+)!)?                           # epoch
        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P<pre>                                          # pre-release
            [-_\.]?                                        # 可选的分隔符
            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))   # pre-release 类型
            [-_\.]?                                        # 可选的分隔符
            (?P<pre_n>[0-9]+)?                             # 可选的 pre-release 版本号
        )?
        (?P<post>                                         # post release
            (?:-(?P<post_n1>[0-9]+))                       # post-release 版本号1
            |                                              # 或者
            (?:
                [-_\.]?                                    # 可选的分隔符
                (?P<post_l>post|rev|r)                      # post-release 类型
                [-_\.]?                                    # 可选的分隔符
                (?P<post_n2>[0-9]+)?                        # 可选的 post-release 版本号2
            )
        )?
        (?P<dev>                                          # dev release
            [-_\.]?                                        # 可选的分隔符
            (?P<dev_l>dev)                                 # dev-release 类型
            [-_\.]?                                        # 可选的分隔符
            (?P<dev_n>[0-9]+)?                             # 可选的 dev-release 版本号
        )?
    )
    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
"""

class Version(_BaseVersion):
    
    # 编译版本号正则表达式模式,忽略大小写和允许多行注释模式
    _regex = re.compile(
        r"^\s*" + VERSION_PATTERN + r"\s*$",
        re.VERBOSE | re.IGNORECASE,
    )

    def __init__(self, version):
        # 验证并解析给定的版本号字符串
        match = self._regex.search(version)
        if not match:
            raise InvalidVersion("Invalid version: '{0}'".format(version))

        # 解析版本号各个部分并存储
        self._version = _Version(
            epoch=int(match.group("epoch")) if match.group("epoch") else 0,  # 解析 epoch
            release=tuple(int(i) for i in match.group("release").split(".")),  # 解析 release
            pre=_parse_letter_version(
                match.group("pre_l"),
                match.group("pre_n"),
            ),  # 解析 pre-release
            post=_parse_letter_version(
                match.group("post_l"),
                match.group("post_n1") or match.group("post_n2"),
            ),  # 解析 post-release
            dev=_parse_letter_version(
                match.group("dev_l"),
                match.group("dev_n"),
            ),  # 解析 dev-release
            local=_parse_local_version(match.group("local")),  # 解析 local version
        )

        # 生成用于排序的关键字
        self._key = _cmpkey(
            self._version.epoch,
            self._version.release,
            self._version.pre,
            self._version.post,
            self._version.dev,
            self._version.local,
        )

    def __repr__(self):
        return "<Version({0})>".format(repr(str(self)))
    # 返回对象的字符串表示形式
    def __str__(self):
        # 初始化一个空列表,用于存储版本号的各个部分
        parts = []

        # 如果版本中的 epoch 不为 0,则添加到 parts 列表中
        if self._version.epoch != 0:
            parts.append("{0}!".format(self._version.epoch))

        # 添加版本号的 release 段,转换为字符串后添加到 parts 列表中
        parts.append(".".join(str(x) for x in self._version.release))

        # 如果存在预发行版本(pre-release),则将其转换为字符串添加到 parts 列表中
        if self._version.pre is not None:
            parts.append("".join(str(x) for x in self._version.pre))

        # 如果存在后发布版本(post-release),则添加以 ".post" 开头的版本号到 parts 列表中
        if self._version.post is not None:
            parts.append(".post{0}".format(self._version.post[1]))

        # 如果存在开发中版本(development release),则添加以 ".dev" 开头的版本号到 parts 列表中
        if self._version.dev is not None:
            parts.append(".dev{0}".format(self._version.dev[1]))

        # 如果存在本地版本段(local version segment),则添加以 "+" 开头的版本号到 parts 列表中
        if self._version.local is not None:
            parts.append(
                "+{0}".format(".".join(str(x) for x in self._version.local))
            )

        # 将 parts 列表中的所有部分连接成一个字符串并返回
        return "".join(parts)

    # 返回公共版本号(去除本地版本信息后的版本号)
    @property
    def public(self):
        # 将版本字符串按 "+" 分割,并取第一个部分作为公共版本号
        return str(self).split("+", 1)[0]

    # 返回基本版本号(去除开发版本信息和本地版本信息后的版本号)
    @property
    def base_version(self):
        # 初始化一个空列表,用于存储版本号的各个部分
        parts = []

        # 如果版本中的 epoch 不为 0,则添加到 parts 列表中
        if self._version.epoch != 0:
            parts.append("{0}!".format(self._version.epoch))

        # 添加版本号的 release 段,转换为字符串后添加到 parts 列表中
        parts.append(".".join(str(x) for x in self._version.release))

        # 将 parts 列表中的所有部分连接成一个字符串并返回
        return "".join(parts)

    # 返回本地版本信息(若存在)
    @property
    def local(self):
        # 获取版本号的字符串表示形式
        version_string = str(self)
        # 如果版本号中包含 "+"
        if "+" in version_string:
            # 将版本号按 "+" 分割,并取第二部分作为本地版本信息
            return version_string.split("+", 1)[1]

    # 返回是否为预发布版本(包含开发版本或预发布版本)
    @property
    def is_prerelease(self):
        # 如果存在开发版本(dev)或预发布版本(pre),返回 True,否则返回 False
        return bool(self._version.dev or self._version.pre)

    # 返回是否为后发布版本
    @property
    def is_postrelease(self):
        # 如果存在后发布版本(post),返回 True,否则返回 False
        return bool(self._version.post)
def _parse_letter_version(letter, number):
    if letter:
        # 如果存在 letter,则假设在预发布版本中没有数字与之关联时默认为 0
        if number is None:
            number = 0

        # 将 letter 规范化为小写形式
        letter = letter.lower()

        # 将一些单词视为其他单词的替代拼写,在这些情况下将其规范化为首选拼写
        if letter == "alpha":
            letter = "a"
        elif letter == "beta":
            letter = "b"
        elif letter in ["c", "pre", "preview"]:
            letter = "rc"
        elif letter in ["rev", "r"]:
            letter = "post"

        # 返回规范化后的 letter 和转换为整数的 number
        return letter, int(number)
    
    if not letter and number:
        # 如果没有 letter 但有 number,则假设这是使用隐含的 post 发布语法(例如,1.0-1)
        letter = "post"

        # 返回 letter 和转换为整数的 number
        return letter, int(number)


_local_version_seperators = re.compile(r"[\._-]")


def _parse_local_version(local):
    """
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    """
    if local is not None:
        # 将 local 字符串根据分隔符(`.`、`_`、`-`)分割并转换为小写或整数形式
        return tuple(
            part.lower() if not part.isdigit() else int(part)
            for part in _local_version_seperators.split(local)
        )


def _cmpkey(epoch, release, pre, post, dev, local):
    # 当比较发布版本时,我们希望去掉所有尾随的零。因此,将列表反转,删除所有前导的零,
    # 直到遇到非零元素,然后将其再次反转为正确的顺序,并转换为元组作为排序键。
    release = tuple(
        reversed(list(
            itertools.dropwhile(
                lambda x: x == 0,
                reversed(release),
            )
        ))
    )

    # 我们需要“欺骗”排序算法,以便在 1.0.dev0 之前放置 1.0a0。我们将通过滥用 pre 段来做到这一点,
    # 但仅当没有 pre 或 post 段时才这样做。如果有这些段中的任何一个,正常的排序规则将正确处理这种情况。
    if pre is None and post is None and dev is not None:
        pre = -Infinity
    # 没有预发布版本的版本(除非如上所述)应该在具有预发布版本的版本之后排序。
    elif pre is None:
        pre = Infinity

    # 没有 post 段的版本应该在具有 post 段的版本之前排序。
    if post is None:
        post = -Infinity

    # 没有开发段的版本应该在具有开发段的版本之后排序。
    if dev is None:
        dev = Infinity

    if local is None:
        # 没有本地段的版本应该在具有本地段的版本之前排序。
        local = -Infinity
    else:
        # 如果版本有本地段(local segment),需要解析该段以实现 PEP440 中的排序规则。
        # - 字母数字段在数字段之前排序
        # - 字母数字段按词典顺序排序
        # - 数字段按数值排序
        # - 当前缀完全匹配时,较短的版本在较长的版本之前排序
        # 将本地段转换为元组,处理为(i, "")如果i是整数,否则处理为(-Infinity, i)
        local = tuple(
            (i, "") if isinstance(i, int) else (-Infinity, i)
            for i in local
        )

    # 返回解析后的各个版本部分的元组
    return epoch, release, pre, post, dev, local

.\numpy\numpy\_utils\__init__.py

"""
This is a module for defining private helpers which do not depend on the
rest of NumPy.

Everything in here must be self-contained so that it can be
imported anywhere else without creating circular imports.
If a utility requires the import of NumPy, it probably belongs
in ``numpy._core``.
"""

import functools
import warnings
from ._convertions import asunicode, asbytes


def set_module(module):
    """Private decorator for overriding __module__ on a function or class.

    Example usage::

        @set_module('numpy')
        def example():
            pass

        assert example.__module__ == 'numpy'
    """
    def decorator(func):
        if module is not None:
            func.__module__ = module
        return func
    return decorator


def _rename_parameter(old_names, new_names, dep_version=None):
    """
    Generate decorator for backward-compatible keyword renaming.

    Apply the decorator generated by `_rename_parameter` to functions with a
    renamed parameter to maintain backward-compatibility.

    After decoration, the function behaves as follows:
    If only the new parameter is passed into the function, behave as usual.
    If only the old parameter is passed into the function (as a keyword), raise
    a DeprecationWarning if `dep_version` is provided, and behave as usual
    otherwise.
    If both old and new parameters are passed into the function, raise a
    DeprecationWarning if `dep_version` is provided, and raise the appropriate
    TypeError (function got multiple values for argument).

    Parameters
    ----------
    old_names : list of str
        Old names of parameters
    new_names : list of str
        New names of parameters
    dep_version : str, optional
        Version of NumPy in which old parameter was deprecated in the format
        'X.Y.Z'. If supplied, the deprecation message will indicate that
        support for the old parameter will be removed in version 'X.Y+2.Z'

    Notes
    -----
    Untested with functions that accept *args. Probably won't work as written.

    """
    # 定义装饰器函数,接受一个函数作为参数
    def decorator(fun):
        # 使用 functools 模块的 wraps 装饰器保留原始函数的元数据
        @functools.wraps(fun)
        # 定义装饰后的函数 wrapper,接受任意数量的位置参数和关键字参数
        def wrapper(*args, **kwargs):
            # 遍历 old_names 和 new_names 的元素对
            for old_name, new_name in zip(old_names, new_names):
                # 检查关键字参数 kwargs 中是否存在旧参数名 old_name
                if old_name in kwargs:
                    # 如果指定了 dep_version,处理版本号递增的逻辑
                    if dep_version:
                        # 将 dep_version 拆分为主版本号和次版本号,并将次版本号加 2
                        end_version = dep_version.split('.')
                        end_version[1] = str(int(end_version[1]) + 2)
                        end_version = '.'.join(end_version)
                        # 构建弃用警告消息
                        msg = (f"Use of keyword argument `{old_name}` is "
                               f"deprecated and replaced by `{new_name}`. "
                               f"Support for `{old_name}` will be removed "
                               f"in NumPy {end_version}.")
                        # 发出弃用警告
                        warnings.warn(msg, DeprecationWarning, stacklevel=2)
                    # 检查新参数名 new_name 是否已经存在于 kwargs 中
                    if new_name in kwargs:
                        # 如果存在,抛出类型错误,指示参数重复
                        msg = (f"{fun.__name__}() got multiple values for "
                               f"argument now known as `{new_name}`")
                        raise TypeError(msg)
                    # 将旧参数名对应的值移到新参数名下
                    kwargs[new_name] = kwargs.pop(old_name)
            # 调用原始函数 fun,并传递更新后的参数 kwargs
            return fun(*args, **kwargs)
        # 返回装饰后的函数 wrapper
        return wrapper

.\numpy\numpy\__init__.cython-30.pxd

# NumPy static imports for Cython >= 3.0
#
# If any of the PyArray_* functions are called, import_array must be
# called first.  This is done automatically by Cython 3.0+ if a call
# is not detected inside of the module.
#
# Author: Dag Sverre Seljebotn
#

# 从cpython.ref中导入Py_INCREF函数
from cpython.ref cimport Py_INCREF
# 从cpython.object中导入PyObject, PyTypeObject, PyObject_TypeCheck对象
from cpython.object cimport PyObject, PyTypeObject, PyObject_TypeCheck
# 使用libc.stdio标准库中的所有函数
cimport libc.stdio as stdio


# 从外部导入声明,这里是为了说明NumPy API声明来自于NumPy自身而不是Cython
cdef extern from *:
    """
    /* Using NumPy API declarations from "numpy/__init__.cython-30.pxd" */
    """


# 从"numpy/arrayobject.h"中导入声明,定义了多种NumPy中的数据类型
cdef extern from "numpy/arrayobject.h":
    # 定义整型指针和无符号整型指针类型
    ctypedef signed long npy_intp
    ctypedef unsigned long npy_uintp

    # 定义布尔类型
    ctypedef unsigned char npy_bool

    # 定义有符号和无符号各种整型数据类型,包括char、short、int、long、long long等
    ctypedef signed char npy_byte
    ctypedef signed short npy_short
    ctypedef signed int npy_int
    ctypedef signed long npy_long
    ctypedef signed long long npy_longlong

    ctypedef unsigned char npy_ubyte
    ctypedef unsigned short npy_ushort
    ctypedef unsigned int npy_uint
    ctypedef unsigned long npy_ulong
    ctypedef unsigned long long npy_ulonglong

    # 定义浮点数数据类型,包括float、double、long double
    ctypedef float npy_float
    ctypedef double npy_double
    ctypedef long double npy_longdouble

    # 定义各种精度的整型数据类型,如int8、int16、int32、int64等
    ctypedef signed char npy_int8
    ctypedef signed short npy_int16
    ctypedef signed int npy_int32
    ctypedef signed long long npy_int64
    ctypedef signed long long npy_int96
    ctypedef signed long long npy_int128

    ctypedef unsigned char npy_uint8
    ctypedef unsigned short npy_uint16
    ctypedef unsigned int npy_uint32
    ctypedef unsigned long long npy_uint64
    ctypedef unsigned long long npy_uint96
    ctypedef unsigned long long npy_uint128

    # 定义各种精度的浮点数数据类型,如float32、float64等
    ctypedef float npy_float32
    ctypedef double npy_float64
    ctypedef long double npy_float80
    ctypedef long double npy_float96
    ctypedef long double npy_float128

    # 定义复数结构体类型
    ctypedef struct npy_cfloat:
        pass

    ctypedef struct npy_cdouble:
        pass

    ctypedef struct npy_clongdouble:
        pass

    ctypedef struct npy_complex64:
        pass

    ctypedef struct npy_complex128:
        pass

    ctypedef struct npy_complex160:
        pass

    ctypedef struct npy_complex192:
        pass

    ctypedef struct npy_complex256:
        pass

    # 定义PyArray_Dims结构体,包含指向整型指针的指针和长度
    ctypedef struct PyArray_Dims:
        npy_intp *ptr
        int len
    # 定义 NumPy 类型的枚举
    cdef enum NPY_TYPES:
        NPY_BOOL            # 布尔类型
        NPY_BYTE            # 有符号字节
        NPY_UBYTE           # 无符号字节
        NPY_SHORT           # 有符号短整型
        NPY_USHORT          # 无符号短整型
        NPY_INT             # 有符号整型
        NPY_UINT            # 无符号整型
        NPY_LONG            # 有符号长整型
        NPY_ULONG           # 无符号长整型
        NPY_LONGLONG        # 长长整型(有符号)
        NPY_ULONGLONG       # 长长整型(无符号)
        NPY_FLOAT           # 单精度浮点数
        NPY_DOUBLE          # 双精度浮点数
        NPY_LONGDOUBLE      # 长双精度浮点数
        NPY_CFLOAT          # 单精度复数
        NPY_CDOUBLE         # 双精度复数
        NPY_CLONGDOUBLE     # 长双精度复数
        NPY_OBJECT          # Python 对象
        NPY_STRING          # 字符串
        NPY_UNICODE         # Unicode 字符串
        NPY_VOID            # 空类型
        NPY_DATETIME        # 时间日期类型
        NPY_TIMEDELTA       # 时间间隔类型
        NPY_NTYPES_LEGACY   # 遗留的类型数量
        NPY_NOTYPE          # 未指定类型
    
        NPY_INT8            # 8 位整型
        NPY_INT16           # 16 位整型
        NPY_INT32           # 32 位整型
        NPY_INT64           # 64 位整型
        NPY_INT128          # 128 位整型
        NPY_INT256          # 256 位整型
        NPY_UINT8           # 8 位无符号整型
        NPY_UINT16          # 16 位无符号整型
        NPY_UINT32          # 32 位无符号整型
        NPY_UINT64          # 64 位无符号整型
        NPY_UINT128         # 128 位无符号整型
        NPY_UINT256         # 256 位无符号整型
        NPY_FLOAT16         # 16 位浮点数
        NPY_FLOAT32         # 32 位浮点数
        NPY_FLOAT64         # 64 位浮点数
        NPY_FLOAT80         # 80 位浮点数
        NPY_FLOAT96         # 96 位浮点数
        NPY_FLOAT128        # 128 位浮点数
        NPY_FLOAT256        # 256 位浮点数
        NPY_COMPLEX32       # 32 位复数
        NPY_COMPLEX64       # 64 位复数
        NPY_COMPLEX128      # 128 位复数
        NPY_COMPLEX160      # 160 位复数
        NPY_COMPLEX192      # 192 位复数
        NPY_COMPLEX256      # 256 位复数
        NPY_COMPLEX512      # 512 位复数
    
        NPY_INTP            # 平台相关的整数类型
        NPY_DEFAULT_INT     # 非编译时常数(通常不是)
    
    # 定义 NumPy 数组的顺序枚举
    ctypedef enum NPY_ORDER:
        NPY_ANYORDER        # 任意顺序
        NPY_CORDER          # C 顺序
        NPY_FORTRANORDER    # Fortran 顺序
        NPY_KEEPORDER       # 保持原顺序
    
    # 定义 NumPy 类型转换枚举
    ctypedef enum NPY_CASTING:
        NPY_NO_CASTING      # 无转换
        NPY_EQUIV_CASTING   # 等效转换
        NPY_SAFE_CASTING    # 安全转换
        NPY_SAME_KIND_CASTING  # 相同种类的转换
        NPY_UNSAFE_CASTING  # 不安全的转换
    
    # 定义 NumPy 数组边界处理方式枚举
    ctypedef enum NPY_CLIPMODE:
        NPY_CLIP            # 截断处理
        NPY_WRAP            # 环绕处理
        NPY_RAISE           # 报错处理
    
    # 定义标量类型枚举
    ctypedef enum NPY_SCALARKIND:
        NPY_NOSCALAR        # 非标量
        NPY_BOOL_SCALAR     # 布尔标量
        NPY_INTPOS_SCALAR   # 正整数标量
        NPY_INTNEG_SCALAR   # 负整数标量
        NPY_FLOAT_SCALAR    # 浮点数标量
        NPY_COMPLEX_SCALAR  # 复数标量
        NPY_OBJECT_SCALAR   # Python 对象标量
    
    # 定义排序算法枚举
    ctypedef enum NPY_SORTKIND:
        NPY_QUICKSORT       # 快速排序
        NPY_HEAPSORT        # 堆排序
        NPY_MERGESORT       # 归并排序
    
    # 定义搜索边界枚举
    ctypedef enum NPY_SEARCHSIDE:
        NPY_SEARCHLEFT      # 左侧搜索
        NPY_SEARCHRIGHT     # 右侧搜索
    
    # 遗留的 NumPy 标记,自 NumPy 1.7 起废弃!不要在新代码中使用!
    enum:
        NPY_C_CONTIGUOUS    # C 连续数组
        NPY_F_CONTIGUOUS    # Fortran 连续数组
        NPY_CONTIGUOUS      # 连续数组
        NPY_FORTRAN         # Fortran 数组
        NPY_OWNDATA         # 拥有数据
        NPY_FORCECAST       # 强制类型转换
        NPY_ENSURECOPY      # 确保拷贝
        NPY_ENSUREARRAY     # 确保数组
        NPY_ELEMENTSTRIDES  # 元素步长
        NPY_ALIGNED         # 对齐的
        NPY_NOTSWAPPED      # 未交换的
        NPY_WRITEABLE       # 可写的
        NPY_ARR_HAS_DESCR   # 数组有描述
    
        NPY_BEHAVED         # 表现正常
        NPY_BEHAVED_NS      # 表现正常(无标量)
        NPY_CARRAY          # C 数组
        NPY_CARRAY_RO       # 只读 C 数组
        NPY_FARRAY          # Fortran 数组
        NPY_FARRAY_RO       # 只读 Fortran 数组
        NPY_DEFAULT         # 默认
    
        NPY_IN_ARRAY        # 输入数组
        NPY_OUT_ARRAY       # 输出数组
        NPY_INOUT_ARRAY     # 输入输出数组
        NPY_IN_FARRAY       # 输入 Fortran 数组
        NPY_OUT_FARRAY      # 输出 Fortran 数组
        NPY_INOUT_FARRAY    # 输入输出 Fortran 数组
    
        NPY_UPDATE_ALL      # 更新全部
    # 定义 NumPy 数组的属性和行为标志,用于描述数组的内存布局和操作方式

    enum:
        # 指示数组以 C 风格连续存储(行优先)的标志
        NPY_ARRAY_C_CONTIGUOUS
        # 指示数组以 Fortran 风格连续存储(列优先)的标志
        NPY_ARRAY_F_CONTIGUOUS
        # 指示数组拥有自己的数据副本的标志
        NPY_ARRAY_OWNDATA
        # 强制数据类型转换的标志
        NPY_ARRAY_FORCECAST
        # 确保返回数组的副本而不是视图的标志
        NPY_ARRAY_ENSURECOPY
        # 确保返回一个 ndarray 而不是一个子类的标志
        NPY_ARRAY_ENSUREARRAY
        # 允许传递元素步长参数的标志
        NPY_ARRAY_ELEMENTSTRIDES
        # 数组数据是否按照特定对齐要求对齐的标志
        NPY_ARRAY_ALIGNED
        # 数组数据未被交换的标志
        NPY_ARRAY_NOTSWAPPED
        # 数组可写的标志
        NPY_ARRAY_WRITEABLE
        # 如果数组通过复制后可以写回原始数组,则写回的标志
        NPY_ARRAY_WRITEBACKIFCOPY

        # 默认行为的数组标志
        NPY_ARRAY_BEHAVED
        # 不带隐式复制的默认行为数组标志
        NPY_ARRAY_BEHAVED_NS
        # C 风格连续数组的标志
        NPY_ARRAY_CARRAY
        # 只读的 C 风格连续数组的标志
        NPY_ARRAY_CARRAY_RO
        # Fortran 风格连续数组的标志
        NPY_ARRAY_FARRAY
        # 只读的 Fortran 风格连续数组的标志
        NPY_ARRAY_FARRAY_RO
        # 默认数组标志
        NPY_ARRAY_DEFAULT

        # 输入数组的标志
        NPY_ARRAY_IN_ARRAY
        # 输出数组的标志
        NPY_ARRAY_OUT_ARRAY
        # 输入输出数组的标志
        NPY_ARRAY_INOUT_ARRAY
        # 输入 Fortran 风格连续数组的标志
        NPY_ARRAY_IN_FARRAY
        # 输出 Fortran 风格连续数组的标志
        NPY_ARRAY_OUT_FARRAY
        # 输入输出 Fortran 风格连续数组的标志
        NPY_ARRAY_INOUT_FARRAY

        # 更新所有数组的标志
        NPY_ARRAY_UPDATE_ALL

    cdef enum:
        # NumPy 数组可以拥有的最大维度数,在 NumPy 2.x 为 64,在 NumPy 1.x 为 32
        NPY_MAXDIMS
        # 用于拉平操作(如求平均值)的轴标志
        NPY_RAVEL_AXIS

    ctypedef void (*PyArray_VectorUnaryFunc)(void *, void *, npy_intp, void *, void *)

    ctypedef struct PyArray_ArrayDescr:
        # PyArray_ArrayDescr 结构体,包含一个形状元组,但 Cython 不支持在非 PyObject 声明内使用 "tuple shape",所以这里声明为 PyObject*
        PyObject* shape

    ctypedef struct PyArray_Descr:
        # PyArray_Descr 结构体,目前只是一个占位符
        pass
    # 定义一个 Cython 类型描述符类 numpy.dtype,这个类对应于 NumPy 中的数据类型描述符。
    ctypedef class numpy.dtype [object PyArray_Descr, check_size ignore]:
        # typeobj 是指向 PyTypeObject 结构体的指针,用于描述数据类型的 Python 类型对象
        cdef PyTypeObject* typeobj
        # kind 表示数据类型的种类,如 'i' 表示整数类型
        cdef char kind
        # type 表示数据类型的具体类型,例如 'i' 表示整数,'f' 表示浮点数
        cdef char type
        # byteorder 表示数据的字节顺序,常见值有 '|', '<', '>', '=' 等
        # 注意:Numpy 有时会在共享的数据类型对象上突然改变此字段的值,在小端机器上可能会由 '|' 改为 '<'。如果这对你很重要,使用 PyArray_IsNativeByteOrder(dtype.byteorder) 来检查而不是直接访问此字段。
        cdef char byteorder
        # type_num 是一个整数,用于标识数据类型的编号
        cdef int type_num
    
        # 定义 itemsize 属性,返回数据类型的元素大小(以字节为单位)
        @property
        cdef inline npy_intp itemsize(self) noexcept nogil:
            return PyDataType_ELSIZE(self)
    
        # 定义 alignment 属性,返回数据类型的对齐方式(以字节为单位)
        @property
        cdef inline npy_intp alignment(self) noexcept nogil:
            return PyDataType_ALIGNMENT(self)
    
        # fields 属性返回一个对象,表示数据类型的字段。注意,它可能为 NULL,使用前需检查 PyDataType_HASFIELDS。
        @property
        cdef inline object fields(self):
            return <object>PyDataType_FIELDS(self)
    
        # names 属性返回一个元组,表示数据类型的字段名。注意,它可能为 NULL,使用前需检查 PyDataType_HASFIELDS。
        @property
        cdef inline tuple names(self):
            return <tuple>PyDataType_NAMES(self)
    
        # subarray 属性返回一个 PyArray_ArrayDescr 指针,表示数据类型的子数组描述符。
        # 使用 PyDataType_HASSUBARRAY 来检查此字段是否有效,指针可能为 NULL。
        @property
        cdef inline PyArray_ArrayDescr* subarray(self) noexcept nogil:
            return PyDataType_SUBARRAY(self)
    
        # flags 属性返回一个 npy_uint64 类型的整数,表示数据类型的标志位。
        # 这个属性文档字符串指示它返回数据类型的标志位。
        @property
        cdef inline npy_uint64 flags(self) noexcept nogil:
            """The data types flags."""
            return PyDataType_FLAGS(self)
    
    
    # 定义一个 Cython 类型描述符类 numpy.flatiter,这个类用于处理扁平化的迭代器。
    ctypedef class numpy.flatiter [object PyArrayIterObject, check_size ignore]:
        # 通过宏使用这个类
        pass
    # 定义了一个 Cython 类 `numpy.broadcast`,这个类的内部实现使用了 C 语言风格的类型定义。
    ctypedef class numpy.broadcast [object PyArrayMultiIterObject, check_size ignore]:
    
        @property
        cdef inline int numiter(self) noexcept nogil:
            """返回需要广播到相同形状的数组的数量。"""
            return PyArray_MultiIter_NUMITER(self)
    
        @property
        cdef inline npy_intp size(self) noexcept nogil:
            """返回广播后的总大小。"""
            return PyArray_MultiIter_SIZE(self)
    
        @property
        cdef inline npy_intp index(self) noexcept nogil:
            """返回当前广播结果的一维索引。"""
            return PyArray_MultiIter_INDEX(self)
    
        @property
        cdef inline int nd(self) noexcept nogil:
            """返回广播结果的维数。"""
            return PyArray_MultiIter_NDIM(self)
    
        @property
        cdef inline npy_intp* dimensions(self) noexcept nogil:
            """返回广播结果的形状。"""
            return PyArray_MultiIter_DIMS(self)
    
        @property
        cdef inline void** iters(self) noexcept nogil:
            """返回一个包含迭代器对象的数组,这些迭代器用于一起广播的数组。
            返回后,这些迭代器将被调整以进行广播。"""
            return PyArray_MultiIter_ITERS(self)
    
    
    ctypedef struct PyArrayObject:
        # 用于在无法使用 ndarray 替代 PyArrayObject* 的情况下,如 PyArrayObject**。
        pass
    ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
        cdef __cythonbufferdefaults__ = {"mode": "strided"}

        # NOTE: no field declarations since direct access is deprecated since NumPy 1.7
        # Instead, we use properties that map to the corresponding C-API functions.

        @property
        cdef inline PyObject* base(self) noexcept nogil:
            """Returns a borrowed reference to the object owning the data/memory.
            """
            return PyArray_BASE(self)

        @property
        cdef inline dtype descr(self):
            """Returns an owned reference to the dtype of the array.
            """
            return <dtype>PyArray_DESCR(self)

        @property
        cdef inline int ndim(self) noexcept nogil:
            """Returns the number of dimensions in the array.
            """
            return PyArray_NDIM(self)

        @property
        cdef inline npy_intp *shape(self) noexcept nogil:
            """Returns a pointer to the dimensions/shape of the array.
            The number of elements matches the number of dimensions of the array (ndim).
            Can return NULL for 0-dimensional arrays.
            """
            return PyArray_DIMS(self)

        @property
        cdef inline npy_intp *strides(self) noexcept nogil:
            """Returns a pointer to the strides of the array.
            The number of elements matches the number of dimensions of the array (ndim).
            """
            return PyArray_STRIDES(self)

        @property
        cdef inline npy_intp size(self) noexcept nogil:
            """Returns the total size (in number of elements) of the array.
            """
            return PyArray_SIZE(self)

        @property
        cdef inline char* data(self) noexcept nogil:
            """The pointer to the data buffer as a char*.
            This is provided for legacy reasons to avoid direct struct field access.
            For new code that needs this access, you probably want to cast the result
            of `PyArray_DATA()` instead, which returns a 'void*'.
            """
            return PyArray_BYTES(self)


    int _import_array() except -1
    # A second definition so _import_array isn't marked as used when we use it here.
    # Do not use - subject to change any time.
    int __pyx_import_array "_import_array"() except -1

    #
    # Macros from ndarrayobject.h
    #
    bint PyArray_CHKFLAGS(ndarray m, int flags) nogil
    bint PyArray_IS_C_CONTIGUOUS(ndarray arr) nogil
    bint PyArray_IS_F_CONTIGUOUS(ndarray arr) nogil
    bint PyArray_ISCONTIGUOUS(ndarray m) nogil
    bint PyArray_ISWRITEABLE(ndarray m) nogil
    bint PyArray_ISALIGNED(ndarray m) nogil

    int PyArray_NDIM(ndarray) nogil
    bint PyArray_ISONESEGMENT(ndarray) nogil
    bint PyArray_ISFORTRAN(ndarray) nogil
    int PyArray_FORTRANIF(ndarray) nogil

    void* PyArray_DATA(ndarray) nogil
    char* PyArray_BYTES(ndarray) nogil


注释:

# 定义一个 Cython 类,模拟 NumPy 的 ndarray 对象
ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
    # 定义 Cython 类的属性,默认使用 strided 模式
    cdef __cythonbufferdefaults__ = {"mode": "strided"}

    # 注意:不声明字段,因为自 NumPy 1.7 起直接访问已被弃用
    # 使用属性来映射对应的 C-API 函数

    @property
    cdef inline PyObject* base(self) noexcept nogil:
        """返回一个借用引用,指向拥有数据/内存的对象。
        """
        return PyArray_BASE(self)

    @property
    cdef inline dtype descr(self):
        """返回数组的 dtype 的拥有引用。
        """
        return <dtype>PyArray_DESCR(self)

    @property
    cdef inline int ndim(self) noexcept nogil:
        """返回数组的维度数目。
        """
        return PyArray_NDIM(self)

    @property
    cdef inline npy_intp *shape(self) noexcept nogil:
        """返回指向数组维度/形状的指针。
        元素数目与数组的维度数目 (ndim) 相匹配。
        对于0维数组可能返回NULL。
        """
        return PyArray_DIMS(self)

    @property
    cdef inline npy_intp *strides(self) noexcept nogil:
        """返回指向数组步长的指针。
        元素数目与数组的维度数目 (ndim) 相匹配。
        """
        return PyArray_STRIDES(self)

    @property
    cdef inline npy_intp size(self) noexcept nogil:
        """返回数组的总大小(元素数目)。
        """
        return PyArray_SIZE(self)

    @property
    cdef inline char* data(self) noexcept nogil:
        """指向数据缓冲区的 char* 指针。
        出于遗留原因提供此方法,以避免直接访问结构字段。
        对于需要此访问的新代码,建议使用 `PyArray_DATA()` 的结果进行转换,它返回 'void*'。
        """
        return PyArray_BYTES(self)


int _import_array() except -1
# 第二个定义,以避免在此处使用时标记 _import_array 为已使用。
# 不要使用 - 随时可能更改。

int __pyx_import_array "_import_array"() except -1

#
# 从 ndarrayobject.h 中的宏定义
#
bint PyArray_CHKFLAGS(ndarray m, int flags) nogil
bint PyArray_IS_C_CONTIGUOUS(ndarray arr) nogil
bint PyArray_IS_F_CONTIGUOUS(ndarray arr) nogil
bint PyArray_ISCONTIGUOUS(ndarray m) nogil
bint PyArray_ISWRITEABLE(ndarray m) nogil
bint PyArray_ISALIGNED(ndarray m) nogil

int PyArray_NDIM(ndarray) nogil
bint PyArray_ISONESEGMENT(ndarray) nogil
bint PyArray_ISFORTRAN(ndarray) nogil
int PyArray_FORTRANIF(ndarray) nogil

void* PyArray_DATA(ndarray) nogil
char* PyArray_BYTES(ndarray) nogil
    npy_intp* PyArray_DIMS(ndarray) nogil
    // 返回指向数组维度的指针,不会引发GIL

    npy_intp* PyArray_STRIDES(ndarray) nogil
    // 返回指向数组步幅的指针,不会引发GIL

    npy_intp PyArray_DIM(ndarray, size_t) nogil
    // 返回指定索引的数组维度大小,不会引发GIL

    npy_intp PyArray_STRIDE(ndarray, size_t) nogil
    // 返回指定索引的数组步幅大小,不会引发GIL

    PyObject *PyArray_BASE(ndarray) nogil  // returns borrowed reference!
    // 返回数组的基础对象,借用引用,不会引发GIL

    PyArray_Descr *PyArray_DESCR(ndarray) nogil  // returns borrowed reference to dtype!
    // 返回数组的描述符,借用引用,不会引发GIL

    PyArray_Descr *PyArray_DTYPE(ndarray) nogil  // returns borrowed reference to dtype! NP 1.7+ alias for descr.
    // 返回数组的数据类型描述符,借用引用,不会引发GIL,NP 1.7+中是descr的别名

    int PyArray_FLAGS(ndarray) nogil
    // 返回数组的标志位,不会引发GIL

    void PyArray_CLEARFLAGS(ndarray, int flags) nogil  // Added in NumPy 1.7
    // 清除数组的指定标志位,不会引发GIL,NumPy 1.7中新增

    void PyArray_ENABLEFLAGS(ndarray, int flags) nogil  // Added in NumPy 1.7
    // 启用数组的指定标志位,不会引发GIL,NumPy 1.7中新增

    npy_intp PyArray_ITEMSIZE(ndarray) nogil
    // 返回数组元素的大小(字节数),不会引发GIL

    int PyArray_TYPE(ndarray arr) nogil
    // 返回数组的数据类型编号,不会引发GIL

    object PyArray_GETITEM(ndarray arr, void *itemptr)
    // 从数组中获取指定位置的元素,不会引发GIL

    int PyArray_SETITEM(ndarray arr, void *itemptr, object obj) except -1
    // 将对象设置到数组的指定位置,不会引发GIL,异常时返回-1

    bint PyTypeNum_ISBOOL(int) nogil
    // 检查指定的数据类型编号是否是布尔类型,不会引发GIL

    bint PyTypeNum_ISUNSIGNED(int) nogil
    // 检查指定的数据类型编号是否是无符号整数类型,不会引发GIL

    bint PyTypeNum_ISSIGNED(int) nogil
    // 检查指定的数据类型编号是否是有符号整数类型,不会引发GIL

    bint PyTypeNum_ISINTEGER(int) nogil
    // 检查指定的数据类型编号是否是整数类型,不会引发GIL

    bint PyTypeNum_ISFLOAT(int) nogil
    // 检查指定的数据类型编号是否是浮点数类型,不会引发GIL

    bint PyTypeNum_ISNUMBER(int) nogil
    // 检查指定的数据类型编号是否是数值类型,不会引发GIL

    bint PyTypeNum_ISSTRING(int) nogil
    // 检查指定的数据类型编号是否是字符串类型,不会引发GIL

    bint PyTypeNum_ISCOMPLEX(int) nogil
    // 检查指定的数据类型编号是否是复数类型,不会引发GIL

    bint PyTypeNum_ISFLEXIBLE(int) nogil
    // 检查指定的数据类型编号是否是灵活类型,不会引发GIL

    bint PyTypeNum_ISUSERDEF(int) nogil
    // 检查指定的数据类型编号是否是用户定义类型,不会引发GIL

    bint PyTypeNum_ISEXTENDED(int) nogil
    // 检查指定的数据类型编号是否是扩展类型,不会引发GIL

    bint PyTypeNum_ISOBJECT(int) nogil
    // 检查指定的数据类型编号是否是对象类型,不会引发GIL

    npy_intp PyDataType_ELSIZE(dtype) nogil
    // 返回数据类型描述符的元素大小(字节数),不会引发GIL

    npy_intp PyDataType_ALIGNMENT(dtype) nogil
    // 返回数据类型描述符的对齐方式,不会引发GIL

    PyObject* PyDataType_METADATA(dtype) nogil
    // 返回数据类型描述符的元数据对象,不会引发GIL

    PyArray_ArrayDescr* PyDataType_SUBARRAY(dtype) nogil
    // 返回数据类型描述符的子数组描述符,不会引发GIL

    PyObject* PyDataType_NAMES(dtype) nogil
    // 返回数据类型描述符的字段名称,不会引发GIL

    PyObject* PyDataType_FIELDS(dtype) nogil
    // 返回数据类型描述符的字段描述符,不会引发GIL

    bint PyDataType_ISBOOL(dtype) nogil
    // 检查指定的数据类型描述符是否是布尔类型,不会引发GIL

    bint PyDataType_ISUNSIGNED(dtype) nogil
    // 检查指定的数据类型描述符是否是无符号整数类型,不会引发GIL

    bint PyDataType_ISSIGNED(dtype) nogil
    // 检查指定的数据类型描述符是否是有符号整数类型,不会引发GIL

    bint PyDataType_ISINTEGER(dtype) nogil
    // 检查指定的数据类型描述符是否是整数类型,不会引发GIL

    bint PyDataType_ISFLOAT(dtype) nogil
    // 检查指定的数据类型描述符是否是浮点数类型,不会引发GIL

    bint PyDataType_ISNUMBER(dtype) nogil
    // 检查指定的数据类型描述符是否是数值类型,不会引发GIL

    bint PyDataType_ISSTRING(dtype) nogil
    // 检查指定的数据类型描述符是否是字符串类型,不会引发GIL

    bint PyDataType_ISCOMPLEX(dtype) nogil
    // 检查指定的数据类型描述符是否是复数类型,不会引发GIL

    bint PyDataType_ISFLEXIBLE(dtype) nogil
    // 检查指定的数据类型描述符是否是灵活类型,不会引发GIL

    bint PyDataType_ISUSERDEF(dtype) nogil
    // 检查指定的数据类型描述符是否是用户定义类型,不会引发GIL

    bint PyDataType_ISEXTENDED(dtype) nogil
    // 检查指定的数据类型描述符是否是扩展类型,不会引发GIL

    bint PyDataType_ISOBJECT(dtype) nogil
    // 检查指定的数据类型描述符是否是对象类型,不会引发GIL

    bint PyDataType_HASFIELDS(dtype) nogil
    // 检查指定的数据类型描述符是否有字段,不会引发GIL

    bint PyDataType_HASSUBARRAY(dtype) nogil
    // 检查指定的数据类型描述符是否有子数组,不会引发GIL

    npy_uint64 PyDataType_FLAGS(dtype) nogil
    // 返回数据类型描述符的标志位,不会引发GIL

    bint PyArray_ISBOOL(ndarray) nogil
    // 检查数组是否是布尔类型,不会引发GIL

    bint PyArray_ISUNSIGNED(ndarray) nogil
    // 检查数组是否是无符号整数类型,不会引发GIL

    bint PyArray_ISSIGNED(ndarray) nogil
    // 检查数组是否是有符号整数类型,不会引发GIL

    bint PyArray_ISINTEGER(ndarray) nogil
    // 检查数组是否是整数类型,不会引发GIL

    bint PyArray_ISFLOAT(ndarray) nogil
    // 检查数组是否是浮点数类型,不会引发GIL

    bint PyArray_ISNUMBER(ndarray) nogil
    // 检查数组是否是数值类型,不会引发GIL

    bint PyArray
    # 检查数组的字节顺序是否与本地字节顺序相同,适用于ndarray.byteorder
    bint PyArray_IsNativeByteOrder(char) nogil

    # 检查ndarray是否未交换字节顺序
    bint PyArray_ISNOTSWAPPED(ndarray) nogil

    # 检查ndarray是否已交换字节顺序
    bint PyArray_ISBYTESWAPPED(ndarray) nogil

    # 根据给定的整数值对ndarray进行字节交换
    bint PyArray_FLAGSWAP(ndarray, int) nogil

    # 检查ndarray是否是C连续数组
    bint PyArray_ISCARRAY(ndarray) nogil

    # 检查ndarray是否是只读的C连续数组
    bint PyArray_ISCARRAY_RO(ndarray) nogil

    # 检查ndarray是否是Fortran连续数组
    bint PyArray_ISFARRAY(ndarray) nogil

    # 检查ndarray是否是只读的Fortran连续数组
    bint PyArray_ISFARRAY_RO(ndarray) nogil

    # 检查ndarray是否具有行为符合规范
    bint PyArray_ISBEHAVED(ndarray) nogil

    # 检查ndarray是否具有只读的行为符合规范
    bint PyArray_ISBEHAVED_RO(ndarray) nogil

    # 检查dtype是否未交换字节顺序
    bint PyDataType_ISNOTSWAPPED(dtype) nogil

    # 检查dtype是否已交换字节顺序
    bint PyDataType_ISBYTESWAPPED(dtype) nogil

    # 检查对象是否是有效的PyArray_Descr对象
    bint PyArray_DescrCheck(object)

    # 检查对象是否是PyArray类型或其子类型
    bint PyArray_Check(object)

    # 检查对象是否是PyArray类型且精确匹配
    bint PyArray_CheckExact(object)

    # 检查对象是否是零维数组
    bint PyArray_IsZeroDim(object)

    # 检查对象是否是标量数组
    bint PyArray_CheckScalar(object)

    # 检查对象是否是Python数值类型
    bint PyArray_IsPythonNumber(object)

    # 检查对象是否是Python标量数组
    bint PyArray_IsPythonScalar(object)

    # 检查对象是否是任何标量数组
    bint PyArray_IsAnyScalar(object)

    # 检查对象是否是任何标量数组的类型
    bint PyArray_CheckAnyScalar(object)

    # 获取ndarray的连续副本
    ndarray PyArray_GETCONTIGUOUS(ndarray)

    # 检查两个ndarray是否具有相同的形状
    bint PyArray_SAMESHAPE(ndarray, ndarray) nogil

    # 返回ndarray的元素数
    npy_intp PyArray_SIZE(ndarray) nogil

    # 返回ndarray占用的字节数
    npy_intp PyArray_NBYTES(ndarray) nogil

    # 从任何对象创建一个PyArray对象
    object PyArray_FROM_O(object)

    # 从文件对象创建PyArray对象,支持指定标志
    object PyArray_FROM_OF(object m, int flags)

    # 从对象创建PyArray对象,支持指定类型
    object PyArray_FROM_OT(object m, int type)

    # 从对象创建PyArray对象,支持指定类型和标志
    object PyArray_FROM_OTF(object m, int type, int flags)

    # 从任何对象创建PyArray对象,支持指定类型和范围
    object PyArray_FROMANY(object m, int type, int min, int max, int flags)

    # 创建一个指定形状、类型和存储顺序的全零数组
    object PyArray_ZEROS(int nd, npy_intp* dims, int type, int fortran)

    # 创建一个指定形状、类型和存储顺序的空数组
    object PyArray_EMPTY(int nd, npy_intp* dims, int type, int fortran)

    # 用指定的字节填充ndarray
    void PyArray_FILLWBYTE(ndarray, int val)

    # 从任何对象创建一个连续的PyArray对象
    object PyArray_ContiguousFromAny(op, int, int min_depth, int max_depth)

    # 检查两个ndarray的等效数组类型
    unsigned char PyArray_EquivArrTypes(ndarray a1, ndarray a2)

    # 检查两个字节顺序是否等效
    bint PyArray_EquivByteorders(int b1, int b2) nogil

    # 创建一个简单的PyArray对象,指定形状和类型
    object PyArray_SimpleNew(int nd, npy_intp* dims, int typenum)

    # 从给定数据创建一个简单的PyArray对象,指定形状、类型和数据
    object PyArray_SimpleNewFromData(int nd, npy_intp* dims, int typenum, void* data)

    # 将ndarray转换为Python标量
    object PyArray_ToScalar(void* data, ndarray arr)

    # 获取ndarray的指针,支持1维索引
    void* PyArray_GETPTR1(ndarray m, npy_intp i) nogil

    # 获取ndarray的指针,支持2维索引
    void* PyArray_GETPTR2(ndarray m, npy_intp i, npy_intp j) nogil

    # 获取ndarray的指针,支持3维索引
    void* PyArray_GETPTR3(ndarray m, npy_intp i, npy_intp j, npy_intp k) nogil

    # 获取ndarray的指针,支持4维索引
    void* PyArray_GETPTR4(ndarray m, npy_intp i, npy_intp j, npy_intp k, npy_intp l) nogil

    # 创建ndarray的副本
    object PyArray_Copy(ndarray)

    # 从对象创建PyArray对象,支持指定类型和深度范围
    object PyArray_FromObject(object op, int type, int min_depth, int max_depth)

    # 从对象创建连续的PyArray对象,支持指定类型和深度范围
    object PyArray_ContiguousFromObject(object op, int type, int min_depth, int max_depth)

    # 从对象创建PyArray对象的副本,支持指定类型和深度范围
    object PyArray_CopyFromObject(object op, int type, int min_depth, int max_depth)

    # 将ndarray转换为指定类型的PyArray对象
    object PyArray_Cast(ndarray mp, int type_num)
    # 定义 PyArray_Take 函数,用于从数组中按照给定轴取出指定的元素
    object PyArray_Take(ndarray ap, object items, int axis)
    
    # 定义 PyArray_Put 函数,用于将指定的值放置到数组中的指定位置
    object PyArray_Put(ndarray ap, object items, object values)
    
    # 重置 flatiter 对象,使其指向迭代器的起始位置
    void PyArray_ITER_RESET(flatiter it) nogil
    
    # 将 flatiter 对象向前移动到下一个元素位置
    void PyArray_ITER_NEXT(flatiter it) nogil
    
    # 将 flatiter 对象移动到指定的多维索引位置
    void PyArray_ITER_GOTO(flatiter it, npy_intp* destination) nogil
    
    # 将 flatiter 对象移动到一维索引位置
    void PyArray_ITER_GOTO1D(flatiter it, npy_intp ind) nogil
    
    # 返回 flatiter 对象当前位置的数据指针
    void* PyArray_ITER_DATA(flatiter it) nogil
    
    # 检查 flatiter 对象是否迭代完毕,返回 bint 类型
    bint PyArray_ITER_NOTDONE(flatiter it) nogil
    
    # 重置 broadcast multi 对象,使其指向多迭代器的起始位置
    void PyArray_MultiIter_RESET(broadcast multi) nogil
    
    # 将 broadcast multi 对象向前移动到下一个元素位置
    void PyArray_MultiIter_NEXT(broadcast multi) nogil
    
    # 将 broadcast multi 对象移动到指定的一维索引位置
    void PyArray_MultiIter_GOTO(broadcast multi, npy_intp dest) nogil
    
    # 将 broadcast multi 对象移动到一维索引位置
    void PyArray_MultiIter_GOTO1D(broadcast multi, npy_intp ind) nogil
    
    # 返回 broadcast multi 对象当前索引 i 处的数据指针
    void* PyArray_MultiIter_DATA(broadcast multi, npy_intp i) nogil
    
    # 将 broadcast multi 对象的第 i 个迭代器向前移动到下一个元素位置
    void PyArray_MultiIter_NEXTi(broadcast multi, npy_intp i) nogil
    
    # 检查 broadcast multi 对象是否所有迭代器都未迭代完,返回 bint 类型
    bint PyArray_MultiIter_NOTDONE(broadcast multi) nogil
    
    # 返回 broadcast multi 对象的总大小
    npy_intp PyArray_MultiIter_SIZE(broadcast multi) nogil
    
    # 返回 broadcast multi 对象的维度数
    int PyArray_MultiIter_NDIM(broadcast multi) nogil
    
    # 返回 broadcast multi 对象当前索引
    npy_intp PyArray_MultiIter_INDEX(broadcast multi) nogil
    
    # 返回 broadcast multi 对象包含的迭代器数量
    int PyArray_MultiIter_NUMITER(broadcast multi) nogil
    
    # 返回 broadcast multi 对象的维度数组
    npy_intp* PyArray_MultiIter_DIMS(broadcast multi) nogil
    
    # 返回 broadcast multi 对象的迭代器数组
    void** PyArray_MultiIter_ITERS(broadcast multi) nogil
    
    # 递增 ndarray 对象的引用计数
    int PyArray_INCREF (ndarray) except *  # uses PyArray_Item_INCREF...
    
    # 递减 ndarray 对象的引用计数
    int PyArray_XDECREF (ndarray) except *  # uses PyArray_Item_DECREF...
    
    # 根据给定的整数类型创建并返回 dtype 对象
    dtype PyArray_DescrFromType (int)
    
    # 根据给定的整数类型创建并返回对应的 PyArray_TypeObject 对象
    object PyArray_TypeObjectFromType (int)
    
    # 创建并返回指定大小的以零填充的数组
    char * PyArray_Zero (ndarray)
    
    # 创建并返回指定大小的以一填充的数组
    char * PyArray_One (ndarray)
    
    # 检查从一个整数类型到另一个整数类型是否可以安全转换,写入错误信息
    int PyArray_CanCastSafely (int, int)  # writes errors
    
    # 检查从一个 dtype 对象到另一个 dtype 对象是否可以安全转换,写入错误信息
    npy_bool PyArray_CanCastTo (dtype, dtype)  # writes errors
    
    # 返回 object 对象的类型,如果不符合则返回 0
    int PyArray_ObjectType (object, int) except 0
    
    # 根据给定的 object 对象和 dtype 对象返回描述符 dtype
    dtype PyArray_DescrFromObject (object, dtype)
    
    # 返回标量对象的描述符 dtype
    dtype PyArray_DescrFromScalar (object)
    
    # 根据给定的对象返回其对应的描述符 dtype
    dtype PyArray_DescrFromTypeObject (object)
    
    # 返回对象的大小(元素数量)
    npy_intp PyArray_Size (object)
    
    # 确保返回的对象是 ndarray 类型
    object PyArray_EnsureArray (object)
    
    # 确保返回的对象是任意数组类型
    object PyArray_EnsureAnyArray (object)
    object PyArray_Return (ndarray)
    # 返回一个 ndarray 对象,用于函数返回值

    #object PyArray_GetField (ndarray, dtype, int)
    # 从结构化数组中获取字段值,根据给定的 dtype 和索引 int

    #int PyArray_SetField (ndarray, dtype, int, object) except -1
    # 在结构化数组中设置字段值,根据给定的 dtype、索引 int 和对象 object,若失败返回 -1

    object PyArray_Byteswap (ndarray, npy_bool)
    # 对数组进行字节交换,根据给定的 npy_bool 参数决定是否原地交换

    object PyArray_Resize (ndarray, PyArray_Dims *, int, NPY_ORDER)
    # 调整数组大小,使用 PyArray_Dims * 指定新的维度,int 指定新的维度数目,NPY_ORDER 指定数组的存储顺序

    int PyArray_CopyInto (ndarray, ndarray) except -1
    # 将一个数组的内容复制到另一个数组中,若失败返回 -1

    int PyArray_CopyAnyInto (ndarray, ndarray) except -1
    # 将任意类型的数组的内容复制到另一个数组中,若失败返回 -1

    int PyArray_CopyObject (ndarray, object) except -1
    # 将对象的内容复制到数组中,若失败返回 -1

    object PyArray_NewCopy (ndarray, NPY_ORDER)
    # 创建一个数组的深拷贝,指定数组的存储顺序为 NPY_ORDER

    object PyArray_ToList (ndarray)
    # 将数组转换为 Python 列表对象

    object PyArray_ToString (ndarray, NPY_ORDER)
    # 将数组转换为字符串,指定数组的存储顺序为 NPY_ORDER

    int PyArray_ToFile (ndarray, stdio.FILE *, char *, char *) except -1
    # 将数组保存到文件中,使用指定的文件指针 stdio.FILE *,若失败返回 -1

    int PyArray_Dump (object, object, int) except -1
    # 将对象的数据以二进制形式保存到文件中,指定格式 int,若失败返回 -1

    object PyArray_Dumps (object, int)
    # 将对象的数据以字符串形式返回,指定格式 int

    int PyArray_ValidType (int)
    # 检查给定的整数是否为有效的数组数据类型,无法报错

    void PyArray_UpdateFlags (ndarray, int)
    # 更新数组的标志位,根据给定的整数 int

    object PyArray_New (type, int, npy_intp *, int, npy_intp *, void *, int, int, object)
    # 创建一个新的数组对象,根据给定的 type 和各种参数配置

    #object PyArray_NewFromDescr (type, dtype, int, npy_intp *, npy_intp *, void *, int, object)
    # 根据数组描述符创建一个新的数组对象,具体参数见文档

    #dtype PyArray_DescrNew (dtype)
    # 根据给定的数据类型描述符创建一个新的描述符对象 dtype

    dtype PyArray_DescrNewFromType (int)
    # 根据给定的数据类型创建一个新的数据类型描述符对象 dtype

    double PyArray_GetPriority (object, double)
    # 获取对象的优先级,清除错误(自 1.25 版本开始支持)

    object PyArray_IterNew (object)
    # 创建一个数组的迭代器对象,根据给定的数组对象

    object PyArray_MultiIterNew (int, ...)
    # 创建一个多数组的迭代器对象,根据给定的数组数量和每个数组的参数

    int PyArray_PyIntAsInt (object) except? -1
    # 将 Python 整数对象转换为 C 语言整数,若失败返回 -1

    npy_intp PyArray_PyIntAsIntp (object)
    # 将 Python 整数对象转换为 C 语言整数(通常是数组索引类型)

    int PyArray_Broadcast (broadcast) except -1
    # 广播数组,使得所有输入数组都具有相同的形状和维度,若失败返回 -1

    int PyArray_FillWithScalar (ndarray, object) except -1
    # 使用标量值填充数组,若失败返回 -1

    npy_bool PyArray_CheckStrides (int, int, npy_intp, npy_intp, npy_intp *, npy_intp *)
    # 检查数组的步幅是否符合指定的条件,返回布尔值 npy_bool

    dtype PyArray_DescrNewByteorder (dtype, char)
    # 根据给定的数据类型描述符和字节顺序创建一个新的数据类型描述符对象 dtype

    object PyArray_IterAllButAxis (object, int *)
    # 创建一个数组的迭代器对象,除了指定的轴以外,根据给定的数组对象和轴索引 int *

    #object PyArray_CheckFromAny (object, dtype, int, int, int, object)
    # 检查是否可以从任何对象创建数组,根据给定的参数和类型

    #object PyArray_FromArray (ndarray, dtype, int)
    # 根据现有数组创建一个新的数组对象,根据给定的数据类型和参数

    object PyArray_FromInterface (object)
    # 根据给定的接口对象创建一个新的数组对象

    object PyArray_FromStructInterface (object)
    # 根据给定的结构化接口对象创建一个新的数组对象

    #object PyArray_FromArrayAttr (object, dtype, object)
    # 根据对象的属性创建一个新的数组对象,根据给定的数据类型和属性对象

    #NPY_SCALARKIND PyArray_ScalarKind (int, ndarray*)
    # 获取标量的类型种类,根据给定的整数和数组对象指针

    int PyArray_CanCoerceScalar (int, int, NPY_SCALARKIND)
    # 检查是否可以将一个标量从一种类型转换为另一种类型,根据给定的参数和类型种类

    npy_bool PyArray_CanCastScalar (type, type)
    # 检查是否可以将一个标量从一种类型强制转换为另一种类型,根据给定的数据类型

    int PyArray_RemoveSmallest (broadcast) except -1
    # 移除广播的最小形状,若失败返回 -1

    int PyArray_ElementStrides (object)
    # 计算数组元素的步幅,根据给定的数组对象

    void PyArray_Item_INCREF (char *, dtype) except *
    # 增加数组元素的引用计数,根据给定的元素地址和数据类型

    void PyArray_Item_XDECREF (char *, dtype) except *
    # 减少数组元素的引用计数,根据给定的元素地址和数据类型

    object PyArray_Transpose (ndarray, PyArray_Dims *)
    # 对数组进行转置操作,根据给定的数组对象和维度

    object PyArray_TakeFrom (ndarray, object, int, ndarray, NPY_CLIPMODE)
    # 从数组中取出指定元素构成新的数组,根据给定的参数和取值模式

    object PyArray_PutTo (ndarray, object, object, NPY_CLIPMODE)
    # 将一组值放置到数组中指定的位置,根据给定的参数和放置模式

    object PyArray_PutMask (ndarray, object, object)
    # 根据掩码数组将值放置到目标数组中,根据给定的参数

    object PyArray_Repeat (ndarray, object, int)
    # 对数组进行重复操作,根据给定的参数

    object PyArray_Choose (ndarray, object, ndarray, NPY_CLIPMODE)
    # 根据索引数组从给定的选择数组中选择值,根据给定的参数和选择模式

    int PyArray_Sort (ndarray, int, NPY_SORTKIND) except -1
    # 对数组进行排序操作,根据给定的
    # 创建一个新的数组,将其形状重塑为指定维度和顺序
    object PyArray_Newshape (ndarray, PyArray_Dims *, NPY_ORDER)
    
    # 去除数组中维度为1的轴
    object PyArray_Squeeze (ndarray)
    
    # 交换数组中指定的两个轴的位置
    object PyArray_SwapAxes (ndarray, int, int)
    
    # 返回数组中指定轴上的最大值
    object PyArray_Max (ndarray, int, ndarray)
    
    # 返回数组中指定轴上的最小值
    object PyArray_Min (ndarray, int, ndarray)
    
    # 返回数组中指定轴上的最大值和最小值之差
    object PyArray_Ptp (ndarray, int, ndarray)
    
    # 返回数组中指定轴上的平均值
    object PyArray_Mean (ndarray, int, int, ndarray)
    
    # 返回数组对角线元素的和
    object PyArray_Trace (ndarray, int, int, int, int, ndarray)
    
    # 返回数组对角线的视图
    object PyArray_Diagonal (ndarray, int, int, int)
    
    # 将数组元素限制在给定范围内
    object PyArray_Clip (ndarray, object, object, ndarray)
    
    # 返回数组中非零元素的索引数组
    object PyArray_Nonzero (ndarray)
    
    # 返回数组指定轴上的标准差
    object PyArray_Std (ndarray, int, int, ndarray, int)
    
    # 返回数组指定轴上的元素和
    object PyArray_Sum (ndarray, int, int, ndarray)
    
    # 返回数组指定轴上的累积和
    object PyArray_CumSum (ndarray, int, int, ndarray)
    
    # 返回数组指定轴上的元素乘积
    object PyArray_Prod (ndarray, int, int, ndarray)
    
    # 返回数组指定轴上的累积乘积
    object PyArray_CumProd (ndarray, int, int, ndarray)
    
    # 检查数组指定轴上的所有元素是否为真
    object PyArray_All (ndarray, int, ndarray)
    
    # 检查数组指定轴上是否有任何元素为真
    object PyArray_Any (ndarray, int, ndarray)
    
    # 压缩数组,根据条件筛选元素
    object PyArray_Compress (ndarray, object, int, ndarray)
    
    # 返回一个展平的数组
    object PyArray_Flatten (ndarray, NPY_ORDER)
    
    # 返回一个展平的数组,与 Flatten 功能相似
    object PyArray_Ravel (ndarray, NPY_ORDER)
    
    # 计算列表中整数的乘积
    npy_intp PyArray_MultiplyList (npy_intp *, int)
    
    # 计算整数列表中整数的乘积
    int PyArray_MultiplyIntList (int *, int)
    
    # 返回数组中指定索引的元素指针
    void * PyArray_GetPtr (ndarray, npy_intp*)
    
    # 比较两个整数数组是否相等
    int PyArray_CompareLists (npy_intp *, npy_intp *, int)
    
    # 从 Python 序列中提取整数并转换为数组的索引
    int PyArray_IntpFromSequence (object, npy_intp *, int) except -1
    
    # 连接数组的序列,沿指定轴连接
    object PyArray_Concatenate (object, int)
    
    # 计算数组的内积
    object PyArray_InnerProduct (object, object)
    
    # 计算两个数组的矩阵乘积
    object PyArray_MatrixProduct (object, object)
    
    # 计算数组的相关性
    object PyArray_Correlate (object, object, int)
    
    # 检查两个 dtype 是否等效
    unsigned char PyArray_EquivTypes (dtype, dtype)  # 清除错误
    
    # 根据条件返回数组的索引
    object PyArray_Where (object, object, object)
    
    # 返回指定范围内的均匀间隔的值作为数组
    object PyArray_Arange (double, double, double, int)
    
    # 将排序方式的 Python 对象转换为排序枚举类型
    int PyArray_SortkindConverter (object, NPY_SORTKIND *) except 0
    
    # 返回数组元素四舍五入到指定精度
    object PyArray_Round (ndarray, int, ndarray)
    
    # 检查两个 dtype 编号是否等效
    unsigned char PyArray_EquivTypenums (int, int)
    
    # 注册自定义数据类型到 NumPy 中
    int PyArray_RegisterDataType (dtype) except -1
    
    # 注册自定义类型之间的转换函数到 NumPy 中
    int PyArray_RegisterCastFunc (dtype, int, PyArray_VectorUnaryFunc *) except -1
    # 注册可以转换的数据类型,返回是否成功注册的状态值,若失败返回 -1
    int PyArray_RegisterCanCast (dtype, int, NPY_SCALARKIND) except -1

    # 初始化数组函数操作,传入一个指向 PyArray_ArrFuncs 结构体的指针
    void PyArray_InitArrFuncs (PyArray_ArrFuncs *)

    # 将一个整数转换为长度为 int 的整数元组对象,并返回该对象
    object PyArray_IntTupleFromIntp (int, npy_intp *)

    # 将一个对象转换为 NPY_CLIPMODE 枚举类型,返回是否成功转换的状态值,若失败返回 0
    int PyArray_ClipmodeConverter (object, NPY_CLIPMODE *) except 0

    # 将一个对象转换为 ndarray 对象,返回是否成功转换的状态值,若失败返回 0
    int PyArray_OutputConverter (object, ndarray*) except 0

    # 将一个对象广播到指定形状,返回广播后的对象
    object PyArray_BroadcastToShape (object, npy_intp *, int)

    # 将一个对象转换为 dtype 类型的描述符对象,返回是否成功转换的状态值,若失败返回 0
    int PyArray_DescrAlignConverter (object, dtype*) except 0

    # 将一个对象转换为 dtype 类型的描述符对象,返回是否成功转换的状态值,若失败返回 0
    int PyArray_DescrAlignConverter2 (object, dtype*) except 0

    # 将一个对象转换为搜索方向相关的值,返回是否成功转换的状态值,若失败返回 0
    int PyArray_SearchsideConverter (object, void *) except 0

    # 检查给定的轴是否在合法范围内,返回检查后的轴值,可能会修改传入的 int 值
    object PyArray_CheckAxis (ndarray, int *, int)

    # 计算整数数组中各元素的乘积,返回结果
    npy_intp PyArray_OverflowMultiplyList (npy_intp *, int)

    # 设置 ndarray 对象的基础对象,会“偷取” base 的引用计数,返回是否成功设置的状态值,若失败返回 -1
    int PyArray_SetBaseObject(ndarray, base) except -1 # NOTE: steals a reference to base! Use "set_array_base()" instead.
# Typedefs that matches the runtime dtype objects in
# the numpy module.

# The ones that are commented out needs an IFDEF function
# in Cython to enable them only on the right systems.

# 定义各数据类型的C语言类型别名,以匹配numpy模块中的运行时数据类型对象。

ctypedef npy_int8       int8_t
ctypedef npy_int16      int16_t
ctypedef npy_int32      int32_t
ctypedef npy_int64      int64_t
#ctypedef npy_int96      int96_t  # 需要在Cython中使用IFDEF函数根据系统情况启用

ctypedef npy_uint8      uint8_t
ctypedef npy_uint16     uint16_t
ctypedef npy_uint32     uint32_t
ctypedef npy_uint64     uint64_t
#ctypedef npy_uint96     uint96_t  # 需要在Cython中使用IFDEF函数根据系统情况启用

ctypedef npy_float32    float32_t
ctypedef npy_float64    float64_t
#ctypedef npy_float80    float80_t  # 需要在Cython中使用IFDEF函数根据系统情况启用
#ctypedef npy_float128   float128_t  # 需要在Cython中使用IFDEF函数根据系统情况启用

ctypedef float complex  complex64_t
ctypedef double complex complex128_t

ctypedef npy_longlong   longlong_t
ctypedef npy_ulonglong  ulonglong_t

ctypedef npy_intp       intp_t
ctypedef npy_uintp      uintp_t

ctypedef npy_double     float_t
ctypedef npy_double     double_t
ctypedef npy_longdouble longdouble_t

ctypedef float complex       cfloat_t
ctypedef double complex      cdouble_t
ctypedef double complex      complex_t
ctypedef long double complex clongdouble_t

# 定义Cython中的内联函数,用于创建指定数量输入的PyArray_MultiIter对象

cdef inline object PyArray_MultiIterNew1(a):
    return PyArray_MultiIterNew(1, <void*>a)

cdef inline object PyArray_MultiIterNew2(a, b):
    return PyArray_MultiIterNew(2, <void*>a, <void*>b)

cdef inline object PyArray_MultiIterNew3(a, b, c):
    return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)

cdef inline object PyArray_MultiIterNew4(a, b, c, d):
    return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)

cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
    return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)

# 定义Cython中的内联函数,用于根据数据类型返回其形状信息的元组

cdef inline tuple PyDataType_SHAPE(dtype d):
    if PyDataType_HASSUBARRAY(d):
        return <tuple>d.subarray.shape
    else:
        return ()

# 从numpy/ndarrayobject.h外部引入PyTypeObject类型的对象
# 用于numpy中的时间差和日期时间数组类型的处理

cdef extern from "numpy/ndarrayobject.h":
    PyTypeObject PyTimedeltaArrType_Type
    PyTypeObject PyDatetimeArrType_Type
    ctypedef int64_t npy_timedelta
    ctypedef int64_t npy_datetime

# 从numpy/ndarraytypes.h外部引入结构体和类型定义
# 用于numpy中日期时间相关的元数据和结构体的处理

cdef extern from "numpy/ndarraytypes.h":
    ctypedef struct PyArray_DatetimeMetaData:
        NPY_DATETIMEUNIT base
        int64_t num

    ctypedef struct npy_datetimestruct:
        int64_t year
        int32_t month, day, hour, min, sec, us, ps, as

# 从numpy/arrayscalars.h外部引入的抽象类型定义
# 用于numpy中的各种数值类型的处理

cdef extern from "numpy/arrayscalars.h":

    # abstract types
    ctypedef class numpy.generic [object PyObject]:
        pass
    ctypedef class numpy.number [object PyObject]:
        pass
    ctypedef class numpy.integer [object PyObject]:
        pass
    ctypedef class numpy.signedinteger [object PyObject]:
        pass
    ctypedef class numpy.unsignedinteger [object PyObject]:
        pass
    ctypedef class numpy.inexact [object PyObject]:
        pass
    ctypedef class numpy.floating [object PyObject]:
        pass
    ctypedef class numpy.complexfloating [object PyObject]:
        pass
    # 定义一个 Cython 类,表示 NumPy 中的 flexible 类型
    ctypedef class numpy.flexible [object PyObject]:
        pass
    
    # 定义一个 Cython 类,表示 NumPy 中的 character 类型
    ctypedef class numpy.character [object PyObject]:
        pass
    
    # 定义一个 Cython 结构体,用于存储 Python 中的日期时间标量对象
    ctypedef struct PyDatetimeScalarObject:
        # PyObject_HEAD
        npy_datetime obval  # 存储日期时间值
        PyArray_DatetimeMetaData obmeta  # 存储日期时间元数据
    
    # 定义一个 Cython 结构体,用于存储 Python 中的时间增量标量对象
    ctypedef struct PyTimedeltaScalarObject:
        # PyObject_HEAD
        npy_timedelta obval  # 存储时间增量值
        PyArray_DatetimeMetaData obmeta  # 存储时间增量元数据
    
    # 定义一个 Cython 枚举,表示 NumPy 中的日期时间单位
    ctypedef enum NPY_DATETIMEUNIT:
        NPY_FR_Y  # 年
        NPY_FR_M  # 月
        NPY_FR_W  # 周
        NPY_FR_D  # 天
        NPY_FR_B  # 工作日
        NPY_FR_h  # 小时
        NPY_FR_m  # 分钟
        NPY_FR_s  # 秒
        NPY_FR_ms  # 毫秒
        NPY_FR_us  # 微秒
        NPY_FR_ns  # 纳秒
        NPY_FR_ps  # 皮秒
        NPY_FR_fs  # 飞秒
        NPY_FR_as  # 阿秒
        NPY_FR_GENERIC  # 通用日期时间单位
cdef extern from "numpy/arrayobject.h":
    # 定义了以下函数作为 NumPy 的 C-API 的一部分

    # 在 datetime_strings.c 中定义的函数,返回 ISO 8601 格式日期时间字符串长度
    int get_datetime_iso_8601_strlen "NpyDatetime_GetDatetimeISO8601StrLen" (
            int local, NPY_DATETIMEUNIT base)
    # 在 datetime_strings.c 中定义的函数,将日期时间结构体转换为 ISO 8601 格式字符串
    int make_iso_8601_datetime "NpyDatetime_MakeISO8601Datetime" (
            npy_datetimestruct *dts, char *outstr, npy_intp outlen,
            int local, int utc, NPY_DATETIMEUNIT base, int tzoffset,
            NPY_CASTING casting) except -1

    # 在 datetime.c 中定义的函数,将 Python datetime 对象转换为日期时间结构体
    # 如果对象不是日期时间类型,可能返回 1 (成功返回 0)
    int convert_pydatetime_to_datetimestruct "NpyDatetime_ConvertPyDateTimeToDatetimeStruct" (
            PyObject *obj, npy_datetimestruct *out,
            NPY_DATETIMEUNIT *out_bestunit, int apply_tzinfo) except -1
    # 在 datetime.c 中定义的函数,将 datetime64 数据转换为日期时间结构体
    int convert_datetime64_to_datetimestruct "NpyDatetime_ConvertDatetime64ToDatetimeStruct" (
            PyArray_DatetimeMetaData *meta, npy_datetime dt,
            npy_datetimestruct *out) except -1
    # 在 datetime.c 中定义的函数,将日期时间结构体转换为 datetime64 数据
    int convert_datetimestruct_to_datetime64 "NpyDatetime_ConvertDatetimeStructToDatetime64"(
            PyArray_DatetimeMetaData *meta, const npy_datetimestruct *dts,
            npy_datetime *out) except -1


#
# ufunc API
#

cdef extern from "numpy/ufuncobject.h":
    # 定义了 ufunc 相关的 API 和类型

    # 定义了 PyUFuncGenericFunction 类型,表示 ufunc 的通用函数指针类型
    ctypedef void (*PyUFuncGenericFunction) (char **, npy_intp *, npy_intp *, void *)

    # 定义了 numpy.ufunc 类型的结构体
    ctypedef class numpy.ufunc [object PyUFuncObject, check_size ignore]:
        cdef:
            int nin, nout, nargs
            int identity
            PyUFuncGenericFunction *functions
            void **data
            int ntypes
            int check_return
            char *name
            char *types
            char *doc
            void *ptr
            PyObject *obj
            PyObject *userloops

    # 定义了一些 ufunc 相关的枚举常量
    cdef enum:
        PyUFunc_Zero
        PyUFunc_One
        PyUFunc_None
        UFUNC_FPE_DIVIDEBYZERO
        UFUNC_FPE_OVERFLOW
        UFUNC_FPE_UNDERFLOW
        UFUNC_FPE_INVALID

    # 声明了 PyUFunc_FromFuncAndData 函数,用于创建 ufunc 对象并初始化其函数指针和数据指针
    object PyUFunc_FromFuncAndData(PyUFuncGenericFunction *,
          void **, char *, int, int, int, int, char *, char *, int)
    # 声明了 PyUFunc_RegisterLoopForType 函数,注册指定类型的循环函数到 ufunc 中
    int PyUFunc_RegisterLoopForType(ufunc, int,
                                    PyUFuncGenericFunction, int *, void *) except -1
    # 声明了一系列特定类型的 ufunc 通用函数
    void PyUFunc_f_f_As_d_d \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_d_d \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_f_f \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_g_g \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_F_F_As_D_D \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_F_F \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_D_D \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_G_G \
         (char **, npy_intp *, npy_intp *, void *)
    # 定义一个不返回值的函数 PyUFunc_O_O,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_O_O \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_ff_f_As_dd_d,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_ff_f_As_dd_d \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_ff_f,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_ff_f \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_dd_d,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_dd_d \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_gg_g,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_gg_g \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_FF_F_As_DD_D,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_FF_F_As_DD_D \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_DD_D,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_DD_D \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_FF_F,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_FF_F \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_GG_G,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_GG_G \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_OO_O,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_OO_O \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的方法 PyUFunc_O_O_method,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_O_O_method \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的方法 PyUFunc_OO_O_method,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_OO_O_method \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的方法 PyUFunc_On_Om,接受 char**、npy_intp*、npy_intp* 和 void* 作为参数
    void PyUFunc_On_Om \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义一个不返回值的函数 PyUFunc_clearfperr,清除浮点错误状态
    void PyUFunc_clearfperr()
    
    # 返回当前浮点错误状态的函数 PyUFunc_getfperr
    int PyUFunc_getfperr()
    
    # 用新的函数指针替换给定签名的循环函数
    int PyUFunc_ReplaceLoopBySignature \
        (ufunc, PyUFuncGenericFunction, int *, PyUFuncGenericFunction *)
    
    # 根据给定的函数指针和签名创建一个 ufunc 对象
    object PyUFunc_FromFuncAndDataAndSignature \
             (PyUFuncGenericFunction *, void **, char *, int, int, int,
              int, char *, char *, int, char *)
    
    # 导入 umath 模块,返回 0 表示成功,-1 表示失败
    int _import_umath() except -1
# 增加数组对象的基础对象引用计数,确保在下面的引用转移之前执行此操作!
cdef inline void set_array_base(ndarray arr, object base) except *:
    Py_INCREF(base)  # 重要的是在下面的引用转移之前执行此操作!

cdef inline object get_array_base(ndarray arr):
    base = PyArray_BASE(arr)
    if base is NULL:
        return None
    return <object>base

# 适用于 Cython 代码的 import_* 函数的版本。
cdef inline int import_array() except -1:
    try:
        __pyx_import_array()
    except Exception:
        raise ImportError("numpy._core.multiarray failed to import")

cdef inline int import_umath() except -1:
    try:
        _import_umath()
    except Exception:
        raise ImportError("numpy._core.umath failed to import")

cdef inline int import_ufunc() except -1:
    try:
        _import_umath()
    except Exception:
        raise ImportError("numpy._core.umath failed to import")

# 检查对象是否为 np.timedelta64 类型的 Cython 等效实现。
cdef inline bint is_timedelta64_object(object obj) noexcept:
    """
    Cython equivalent of `isinstance(obj, np.timedelta64)`

    Parameters
    ----------
    obj : object

    Returns
    -------
    bool
    """
    return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)

# 检查对象是否为 np.datetime64 类型的 Cython 等效实现。
cdef inline bint is_datetime64_object(object obj) noexcept:
    """
    Cython equivalent of `isinstance(obj, np.datetime64)`

    Parameters
    ----------
    obj : object

    Returns
    -------
    bool
    """
    return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)

# 获取 numpy datetime64 标量对象底层的 int64 值,不使用 GIL。
cdef inline npy_datetime get_datetime64_value(object obj) noexcept nogil:
    """
    returns the int64 value underlying scalar numpy datetime64 object

    Note that to interpret this as a datetime, the corresponding unit is
    also needed.  That can be found using `get_datetime64_unit`.
    """
    return (<PyDatetimeScalarObject*>obj).obval

# 获取 numpy timedelta64 标量对象底层的 int64 值,不使用 GIL。
cdef inline npy_timedelta get_timedelta64_value(object obj) noexcept nogil:
    """
    returns the int64 value underlying scalar numpy timedelta64 object
    """
    return (<PyTimedeltaScalarObject*>obj).obval

# 获取 numpy datetime64 对象的单位部分。
cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) noexcept nogil:
    """
    returns the unit part of the dtype for a numpy datetime64 object.
    """
    return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base

# 在 v1.6 中添加的迭代器 API。
ctypedef int (*NpyIter_IterNextFunc)(NpyIter* it) noexcept nogil
ctypedef void (*NpyIter_GetMultiIndexFunc)(NpyIter* it, npy_intp* outcoords) noexcept nogil

cdef extern from "numpy/arrayobject.h":
    # 定义 NpyIter 结构体,用于迭代器 API。
    ctypedef struct NpyIter:
        pass

    # 定义返回值枚举,表示操作成功或失败。
    cdef enum:
        NPY_FAIL
        NPY_SUCCEED
    # 枚举常量,用于迭代器的不同设置
    cdef enum:
        # 表示 C 顺序的索引
        NPY_ITER_C_INDEX
        # 表示 Fortran 顺序的索引
        NPY_ITER_F_INDEX
        # 多维索引
        NPY_ITER_MULTI_INDEX
        # 外部代码处理一维最内层循环
        NPY_ITER_EXTERNAL_LOOP
        # 将所有操作数转换为共同的数据类型
        NPY_ITER_COMMON_DTYPE
        # 操作数可能包含引用,迭代过程中需要 API 访问
        NPY_ITER_REFS_OK
        # 允许零大小的操作数,迭代检查 IterSize 是否为 0
        NPY_ITER_ZEROSIZE_OK
        # 允许缩减操作(大小为 0 的步幅,但维度大小大于 1)
        NPY_ITER_REDUCE_OK
        # 启用子范围迭代
        NPY_ITER_RANGED
        # 启用缓冲
        NPY_ITER_BUFFERED
        # 当启用缓冲时,尽可能增长内部循环
        NPY_ITER_GROWINNER
        # 延迟分配缓冲区,直到第一次 Reset* 调用
        NPY_ITER_DELAY_BUFALLOC
        # 当指定 NPY_KEEPORDER 时,禁止反转负步幅轴
        NPY_ITER_DONT_NEGATE_STRIDES
        # 如果有重叠,则复制操作数
        NPY_ITER_COPY_IF_OVERLAP
        # 操作数将被读取和写入
        NPY_ITER_READWRITE
        # 操作数只能被读取
        NPY_ITER_READONLY
        # 操作数只能被写入
        NPY_ITER_WRITEONLY
        # 操作数的数据必须是本机字节顺序
        NPY_ITER_NBO
        # 操作数的数据必须对齐
        NPY_ITER_ALIGNED
        # 操作数的数据必须在内部循环中是连续的
        NPY_ITER_CONTIG
        # 可以复制操作数以满足要求
        NPY_ITER_COPY
        # 可以使用 WRITEBACKIFCOPY 复制操作数以满足要求
        NPY_ITER_UPDATEIFCOPY
        # 如果操作数为 NULL,则分配它
        NPY_ITER_ALLOCATE
        # 如果操作数被分配,则不使用任何子类型
        NPY_ITER_NO_SUBTYPE
        # 这是虚拟数组槽,操作数为 NULL,但存在临时数据
        NPY_ITER_VIRTUAL
        # 要求维度与迭代器维度完全匹配
        NPY_ITER_NO_BROADCAST
        # 此数组正在使用掩码,影响缓冲区 -> 数组复制
        NPY_ITER_WRITEMASKED
        # 此数组是所有 WRITEMASKED 操作数的掩码
        NPY_ITER_ARRAYMASK
        # 假定迭代器顺序数据访问以处理 COPY_IF_OVERLAP
        NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE

    # 创建和销毁函数声明
    # 创建新的迭代器对象,返回 NpyIter 指针
    NpyIter* NpyIter_New(ndarray arr, npy_uint32 flags, NPY_ORDER order,
                         NPY_CASTING casting, dtype datatype) except NULL
    # 创建多个迭代器对象,返回 NpyIter 指针
    NpyIter* NpyIter_MultiNew(npy_intp nop, PyArrayObject** op, npy_uint32 flags,
                              NPY_ORDER order, NPY_CASTING casting, npy_uint32*
                              op_flags, PyArray_Descr** op_dtypes) except NULL
    // 创建一个新的 NpyIter 对象,并返回其指针
    NpyIter* NpyIter_AdvancedNew(npy_intp nop, PyArrayObject** op,
                                 npy_uint32 flags, NPY_ORDER order,
                                 NPY_CASTING casting, npy_uint32* op_flags,
                                 PyArray_Descr** op_dtypes, int oa_ndim,
                                 int** op_axes, const npy_intp* itershape,
                                 npy_intp buffersize) except NULL

    // 复制给定的 NpyIter 对象,并返回其副本的指针
    NpyIter* NpyIter_Copy(NpyIter* it) except NULL

    // 从 NpyIter 对象中移除指定的轴
    int NpyIter_RemoveAxis(NpyIter* it, int axis) except NPY_FAIL

    // 从 NpyIter 对象中移除多重索引
    int NpyIter_RemoveMultiIndex(NpyIter* it) except NPY_FAIL

    // 启用 NpyIter 对象的外部循环模式
    int NpyIter_EnableExternalLoop(NpyIter* it) except NPY_FAIL

    // 释放 NpyIter 对象的内存资源
    int NpyIter_Deallocate(NpyIter* it) except NPY_FAIL

    // 重置 NpyIter 对象的迭代状态
    int NpyIter_Reset(NpyIter* it, char** errmsg) except NPY_FAIL

    // 重置 NpyIter 对象的迭代状态,限定于指定的迭代索引范围
    int NpyIter_ResetToIterIndexRange(NpyIter* it, npy_intp istart,
                                      npy_intp iend, char** errmsg) except NPY_FAIL

    // 设置 NpyIter 对象的基础指针,用于重置迭代状态
    int NpyIter_ResetBasePointers(NpyIter* it, char** baseptrs, char** errmsg) except NPY_FAIL

    // 将 NpyIter 对象的迭代位置移动到指定的多重索引位置
    int NpyIter_GotoMultiIndex(NpyIter* it, const npy_intp* multi_index) except NPY_FAIL

    // 将 NpyIter 对象的迭代位置移动到指定的索引位置
    int NpyIter_GotoIndex(NpyIter* it, npy_intp index) except NPY_FAIL

    // 返回 NpyIter 对象的迭代尺寸
    npy_intp NpyIter_GetIterSize(NpyIter* it) nogil

    // 返回 NpyIter 对象的当前迭代索引
    npy_intp NpyIter_GetIterIndex(NpyIter* it) nogil

    // 返回 NpyIter 对象的迭代索引范围
    void NpyIter_GetIterIndexRange(NpyIter* it, npy_intp* istart,
                                   npy_intp* iend) nogil

    // 将 NpyIter 对象的迭代位置移动到指定的迭代索引
    int NpyIter_GotoIterIndex(NpyIter* it, npy_intp iterindex) except NPY_FAIL

    // 检查 NpyIter 对象是否有延迟缓冲区分配
    npy_bool NpyIter_HasDelayedBufAlloc(NpyIter* it) nogil

    // 检查 NpyIter 对象是否使用外部循环模式
    npy_bool NpyIter_HasExternalLoop(NpyIter* it) nogil

    // 检查 NpyIter 对象是否有多重索引
    npy_bool NpyIter_HasMultiIndex(NpyIter* it) nogil

    // 检查 NpyIter 对象是否有索引
    npy_bool NpyIter_HasIndex(NpyIter* it) nogil

    // 检查 NpyIter 对象是否需要缓冲区
    npy_bool NpyIter_RequiresBuffering(NpyIter* it) nogil

    // 检查 NpyIter 对象是否已经缓冲
    npy_bool NpyIter_IsBuffered(NpyIter* it) nogil

    // 检查 NpyIter 对象是否在增长内部
    npy_bool NpyIter_IsGrowInner(NpyIter* it) nogil

    // 返回 NpyIter 对象的缓冲区大小
    npy_intp NpyIter_GetBufferSize(NpyIter* it) nogil

    // 返回 NpyIter 对象的维度数
    int NpyIter_GetNDim(NpyIter* it) nogil

    // 返回 NpyIter 对象的操作数数量
    int NpyIter_GetNOp(NpyIter* it) nogil

    // 返回 NpyIter 对象指定轴的步长数组
    npy_intp* NpyIter_GetAxisStrideArray(NpyIter* it, int axis) except NULL

    // 返回 NpyIter 对象的形状数组
    int NpyIter_GetShape(NpyIter* it, npy_intp* outshape) nogil

    // 返回 NpyIter 对象的数据类型数组
    PyArray_Descr** NpyIter_GetDescrArray(NpyIter* it)

    // 返回 NpyIter 对象的操作数数组
    PyArrayObject** NpyIter_GetOperandArray(NpyIter* it)

    // 返回 NpyIter 对象指定索引的迭代视图
    ndarray NpyIter_GetIterView(NpyIter* it, npy_intp i)

    // 将 NpyIter 对象的读取标志复制到输出数组
    void NpyIter_GetReadFlags(NpyIter* it, char* outreadflags)

    // 将 NpyIter 对象的写入标志复制到输出数组
    void NpyIter_GetWriteFlags(NpyIter* it, char* outwriteflags)

    // 创建与 NpyIter 对象兼容的步长数组
    int NpyIter_CreateCompatibleStrides(NpyIter* it, npy_intp itemsize,
                                        npy_intp* outstrides) except NPY_FAIL

    // 检查指定操作数是否首次访问
    npy_bool NpyIter_IsFirstVisit(NpyIter* it, int iop) nogil

    // 返回用于迭代 NpyIter 对象的下一个函数指针
    NpyIter_IterNextFunc* NpyIter_GetIterNext(NpyIter* it, char** errmsg) except NULL

    // 返回用于获取 NpyIter 对象的多重索引的函数指针
    NpyIter_GetMultiIndexFunc* NpyIter_GetGetMultiIndex(NpyIter* it,
                                                        char** errmsg) except NULL
    # 获取迭代器中数据指针数组的地址,用于访问数据,不使用全局解释器锁(GIL)
    char** NpyIter_GetDataPtrArray(NpyIter* it) nogil
    
    # 获取迭代器初始数据指针数组的地址,不使用全局解释器锁(GIL)
    char** NpyIter_GetInitialDataPtrArray(NpyIter* it) nogil
    
    # 获取迭代器的索引指针数组的地址
    npy_intp* NpyIter_GetIndexPtr(NpyIter* it)
    
    # 获取迭代器内部步幅数组的地址,不使用全局解释器锁(GIL)
    npy_intp* NpyIter_GetInnerStrideArray(NpyIter* it) nogil
    
    # 获取迭代器内部循环大小指针的地址,不使用全局解释器锁(GIL)
    npy_intp* NpyIter_GetInnerLoopSizePtr(NpyIter* it) nogil
    
    # 将迭代器的内部固定步幅数组复制到给定的输出数组中,不使用全局解释器锁(GIL)
    void NpyIter_GetInnerFixedStrideArray(NpyIter* it, npy_intp* outstrides) nogil
    
    # 检查迭代器是否需要 Python C API 支持,不使用全局解释器锁(GIL)
    npy_bool NpyIter_IterationNeedsAPI(NpyIter* it) nogil
    
    # 调试用:打印迭代器的调试信息
    void NpyIter_DebugPrint(NpyIter* it)

.\numpy\numpy\__init__.pxd

# 导入必要的 Cython 模块和 NumPy 静态声明
#
# 如果调用任何 PyArray_* 函数,必须首先调用 import_array。
#
# 作者:Dag Sverre Seljebotn
#

# 定义缓冲区格式字符串的最大长度
DEF _buffer_format_string_len = 255

# 导入 Cython 中的 Python 缓冲区模块
cimport cpython.buffer as pybuf
# 导入 Cython 中的 Python 引用模块
from cpython.ref cimport Py_INCREF
# 导入 Cython 中的 Python 内存模块
from cpython.mem cimport PyObject_Malloc, PyObject_Free
# 导入 Cython 中的 Python 对象模块
from cpython.object cimport PyObject, PyTypeObject
# 导入 Cython 中的 Python 缓冲区模块
from cpython.buffer cimport PyObject_GetBuffer
# 导入 Cython 中的 Python 类型模块
from cpython.type cimport type
# 导入 libc 中的标准输入输出模块
cimport libc.stdio as stdio

# 从外部导入声明
cdef extern from *:
    # 留下一个标记,表明 NumPy 声明来自 NumPy 本身而不是 Cython。
    # 参考 https://github.com/cython/cython/issues/3573
    """
    /* Using NumPy API declarations from "numpy/__init__.pxd" */
    """

# 从 Python.h 头文件中外部导入声明
cdef extern from "Python.h":
    ctypedef int Py_intptr_t
    bint PyObject_TypeCheck(object obj, PyTypeObject* type)

# 从 numpy/arrayobject.h 头文件中外部导入声明
cdef extern from "numpy/arrayobject.h":
    # 定义 NumPy 中的整型和无符号整型类型
    ctypedef signed long npy_intp
    ctypedef unsigned long npy_uintp

    # 定义 NumPy 中的布尔类型
    ctypedef unsigned char      npy_bool

    # 定义 NumPy 中的有符号整型类型
    ctypedef signed char      npy_byte
    ctypedef signed short     npy_short
    ctypedef signed int       npy_int
    ctypedef signed long      npy_long
    ctypedef signed long long npy_longlong

    # 定义 NumPy 中的无符号整型类型
    ctypedef unsigned char      npy_ubyte
    ctypedef unsigned short     npy_ushort
    ctypedef unsigned int       npy_uint
    ctypedef unsigned long      npy_ulong
    ctypedef unsigned long long npy_ulonglong

    # 定义 NumPy 中的浮点类型
    ctypedef float        npy_float
    ctypedef double       npy_double
    ctypedef long double  npy_longdouble

    # 定义 NumPy 中的特定位数整型类型
    ctypedef signed char        npy_int8
    ctypedef signed short       npy_int16
    ctypedef signed int         npy_int32
    ctypedef signed long long   npy_int64
    ctypedef signed long long   npy_int96
    ctypedef signed long long   npy_int128

    # 定义 NumPy 中的特定位数无符号整型类型
    ctypedef unsigned char      npy_uint8
    ctypedef unsigned short     npy_uint16
    ctypedef unsigned int       npy_uint32
    ctypedef unsigned long long npy_uint64
    ctypedef unsigned long long npy_uint96
    ctypedef unsigned long long npy_uint128

    # 定义 NumPy 中的特定位数浮点类型
    ctypedef float        npy_float32
    ctypedef double       npy_float64
    ctypedef long double  npy_float80
    ctypedef long double  npy_float96
    ctypedef long double  npy_float128

    # 定义 NumPy 中的复数类型
    ctypedef struct npy_cfloat:
        pass

    ctypedef struct npy_cdouble:
        pass

    ctypedef struct npy_clongdouble:
        pass

    ctypedef struct npy_complex64:
        pass

    ctypedef struct npy_complex128:
        pass

    ctypedef struct npy_complex160:
        pass

    ctypedef struct npy_complex192:
        pass

    ctypedef struct npy_complex256:
        pass
    # 定义结构体 PyArray_Dims,包含一个指向 npy_intp 类型的指针和一个整型 len
    ctypedef struct PyArray_Dims:
        npy_intp *ptr
        int len
    
    # 定义枚举类型 NPY_TYPES,列举了多种 NumPy 数值类型常量
    cdef enum NPY_TYPES:
        NPY_BOOL         # 布尔类型
        NPY_BYTE         # 字节(8位有符号整数)
        NPY_UBYTE        # 无符号字节(8位无符号整数)
        NPY_SHORT        # 短整型(16位有符号整数)
        NPY_USHORT       # 无符号短整型(16位无符号整数)
        NPY_INT          # 整型(通常为32位有符号整数)
        NPY_UINT         # 无符号整型(32位无符号整数)
        NPY_LONG         # 长整型(通常为64位有符号整数)
        NPY_ULONG        # 无符号长整型(64位无符号整数)
        NPY_LONGLONG     # 长长整型(通常为128位有符号整数)
        NPY_ULONGLONG    # 无符号长长整型(128位无符号整数)
        NPY_FLOAT        # 单精度浮点型
        NPY_DOUBLE       # 双精度浮点型
        NPY_LONGDOUBLE   # 长双精度浮点型
        NPY_CFLOAT       # 复数,32位浮点实部和虚部
        NPY_CDOUBLE      # 复数,64位浮点实部和虚部
        NPY_CLONGDOUBLE  # 复数,长双精度浮点实部和虚部
        NPY_OBJECT       # Python 对象
        NPY_STRING       # 字符串(固定长度)
        NPY_UNICODE      # Unicode 字符串
        NPY_VOID         # 未知类型
        NPY_DATETIME     # 日期时间
        NPY_TIMEDELTA    # 时间间隔
        NPY_NTYPES_LEGACY  # NumPy 1.14 之前的类型数
        NPY_NOTYPE       # 无类型
    
        # 更详细的整数类型定义
        NPY_INT8          # 8位有符号整数
        NPY_INT16         # 16位有符号整数
        NPY_INT32         # 32位有符号整数
        NPY_INT64         # 64位有符号整数
        NPY_INT128        # 128位有符号整数
        NPY_INT256        # 256位有符号整数
        NPY_UINT8         # 8位无符号整数
        NPY_UINT16        # 16位无符号整数
        NPY_UINT32        # 32位无符号整数
        NPY_UINT64        # 64位无符号整数
        NPY_UINT128       # 128位无符号整数
        NPY_UINT256       # 256位无符号整数
        # 浮点数类型定义
        NPY_FLOAT16       # 半精度浮点数
        NPY_FLOAT32       # 单精度浮点数
        NPY_FLOAT64       # 双精度浮点数
        NPY_FLOAT80       # 扩展精度浮点数
        NPY_FLOAT96       # 96位浮点数
        NPY_FLOAT128      # 128位浮点数
        NPY_FLOAT256      # 256位浮点数
        # 复数类型定义
        NPY_COMPLEX32     # 32位复数
        NPY_COMPLEX64     # 64位复数
        NPY_COMPLEX128    # 128位复数
        NPY_COMPLEX160    # 160位复数
        NPY_COMPLEX192    # 192位复数
        NPY_COMPLEX256    # 256位复数
        NPY_COMPLEX512    # 512位复数
    
        NPY_INTP          # 平台指针大小的整数
        NPY_DEFAULT_INT   # 默认整数类型(通常与平台的 native int 相同)
    
    # 定义枚举类型 NPY_ORDER,指定数组在内存中的存储顺序
    ctypedef enum NPY_ORDER:
        NPY_ANYORDER      # 任意顺序
        NPY_CORDER        # C 顺序(行优先)
        NPY_FORTRANORDER  # Fortran 顺序(列优先)
        NPY_KEEPORDER     # 保持当前顺序
    
    # 定义枚举类型 NPY_CASTING,指定数据类型转换的规则
    ctypedef enum NPY_CASTING:
        NPY_NO_CASTING         # 禁止任何类型转换
        NPY_EQUIV_CASTING      # 仅允许等价类型转换
        NPY_SAFE_CASTING       # 安全类型转换(不损失精度)
        NPY_SAME_KIND_CASTING  # 同类型转换
        NPY_UNSAFE_CASTING     # 不安全类型转换
    
    # 定义枚举类型 NPY_CLIPMODE,指定数据裁剪(超出范围处理)的模式
    ctypedef enum NPY_CLIPMODE:
        NPY_CLIP   # 裁剪
        NPY_WRAP   # 包裹
        NPY_RAISE  # 引发异常
    
    # 定义枚举类型 NPY_SCALARKIND,指定标量的类型
    ctypedef enum NPY_SCALARKIND:
        NPY_NOSCALAR      # 非标量
        NPY_BOOL_SCALAR   # 布尔标量
        NPY_INTPOS_SCALAR # 正整数标量
        NPY_INTNEG_SCALAR # 负整数标量
        NPY_FLOAT_SCALAR  # 浮点数标量
        NPY_COMPLEX_SCALAR  # 复数标量
        NPY_OBJECT_SCALAR    # Python 对象标量
    
    # 定义枚举类型 NPY_SORTKIND,指定数组排序算法的类型
    ctypedef enum NPY_SORTKIND:
        NPY_QUICKSORT  # 快速排序
        NPY_HEAPSORT   # 堆排序
        NPY_MERGESORT  # 归并排序
    
    # 定义枚举类型 NPY_SEARCHSIDE,指定搜索算法的方向
    ctypedef enum NPY_SEARCHSIDE:
        NPY_SEARCHLEFT   # 从左边搜索
        NPY_SEARCHRIGHT  # 从右边搜索
    
    # 未命名的枚举变量,定义了一些已经废弃的 NumPy 标记常量,请勿在新代码中使用
    enum:
        NPY_C_CONTIGUOUS
        NPY_F_CONTIGUOUS
        NPY_CONTIGUOUS
        NPY_FORTRAN
        NPY_OWNDATA
        NPY_FORCECAST
        NPY_ENSURECOPY
        NPY_ENSUREARRAY
        NPY_ELEMENTSTRIDES
        NPY_ALIGNED
        NPY_NOTSWAPPED
        NPY_WRITEABLE
        NPY_ARR_HAS_DESCR
    
        NPY_BEHAVED
        NPY_BEHAVED_NS
        NPY_CARRAY
        NPY_CARRAY_RO
        NPY_FARRAY
        NPY_FARRAY_RO
        NPY_DEFAULT
    
        NPY_IN_ARRAY
        NPY_OUT_ARRAY
        NPY_INOUT_ARRAY
        NPY_IN_FARRAY
        NPY_OUT_FARRAY
        NPY_INOUT_FARRAY
    
        NPY_UPDATE_ALL
    enum:
        # NumPy 1.7 引入的枚举,用以替代上述已弃用的枚举。
        NPY_ARRAY_C_CONTIGUOUS
        NPY_ARRAY_F_CONTIGUOUS
        NPY_ARRAY_OWNDATA
        NPY_ARRAY_FORCECAST
        NPY_ARRAY_ENSURECOPY
        NPY_ARRAY_ENSUREARRAY
        NPY_ARRAY_ELEMENTSTRIDES
        NPY_ARRAY_ALIGNED
        NPY_ARRAY_NOTSWAPPED
        NPY_ARRAY_WRITEABLE
        NPY_ARRAY_WRITEBACKIFCOPY

        NPY_ARRAY_BEHAVED
        NPY_ARRAY_BEHAVED_NS
        NPY_ARRAY_CARRAY
        NPY_ARRAY_CARRAY_RO
        NPY_ARRAY_FARRAY
        NPY_ARRAY_FARRAY_RO
        NPY_ARRAY_DEFAULT

        NPY_ARRAY_IN_ARRAY
        NPY_ARRAY_OUT_ARRAY
        NPY_ARRAY_INOUT_ARRAY
        NPY_ARRAY_IN_FARRAY
        NPY_ARRAY_OUT_FARRAY
        NPY_ARRAY_INOUT_FARRAY

        NPY_ARRAY_UPDATE_ALL

    cdef enum:
        # NumPy 2.x 中为 64,在 NumPy 1.x 中为 32。
        NPY_MAXDIMS  # Used for dimensions in NumPy arrays
        NPY_RAVEL_AXIS  # 在类似 PyArray_Mean 的函数中使用的轴

    ctypedef void (*PyArray_VectorUnaryFunc)(void *, void *, npy_intp, void *,  void *)

    ctypedef struct PyArray_ArrayDescr:
        # shape 是一个元组,但是在非 PyObject* 声明中,Cython 不支持 "tuple shape",因此我们将其声明为 PyObject*。
        PyObject* shape

    ctypedef struct PyArray_Descr:
        pass

    ctypedef class numpy.dtype [object PyArray_Descr, check_size ignore]:
        # 当可能时,使用 PyDataType_* 宏,但是对于一些字段,没有宏来访问,因此一些字段被定义了。
        cdef PyTypeObject* typeobj
        cdef char kind
        cdef char type
        # Numpy 有时会在不通知的情况下更改此字段(例如,在小端机器上,它有时会将 "|" 更改为 "<"),如果这对你很重要,请使用 PyArray_IsNativeByteOrder(dtype.byteorder) 而不是直接访问此字段。
        cdef char byteorder
        # Flags 在 Cython <3 中无法直接访问。使用 PyDataType_FLAGS。
        # cdef char flags
        cdef int type_num
        # itemsize/elsize、alignment、fields、names 和 subarray 必须使用 `PyDataType_*` 访问器宏。在 Cython 3 中,你仍然可以使用 getter 属性 `dtype.itemsize`。

    ctypedef class numpy.flatiter [object PyArrayIterObject, check_size ignore]:
        # 通过宏使用

    ctypedef class numpy.broadcast [object PyArrayMultiIterObject, check_size ignore]:
        cdef int numiter
        cdef npy_intp size, index
        cdef int nd
        cdef npy_intp *dimensions
        cdef void **iters

    ctypedef struct PyArrayObject:
        # 用于在无法替换 PyArrayObject*(如 PyArrayObject**)的情况下使用。
        pass
    ctypedef class numpy.ndarray [object PyArrayObject, check_size ignore]:
        # 定义一个 Cython 类,模拟 NumPy 的 ndarray 对象,这里忽略了一些不稳定的字段。
        cdef __cythonbufferdefaults__ = {"mode": "strided"}
    
        cdef:
            # data 指向数组数据的指针
            char *data
            # ndim 表示数组的维度数
            int ndim "nd"
            # shape 指向数组维度的指针
            npy_intp *shape "dimensions"
            # strides 指向数组步长的指针
            npy_intp *strides
            # descr 表示数组的数据类型,自 NumPy 1.7 起已不推荐使用
            dtype descr  # deprecated since NumPy 1.7 !
            # base 指向 ndarray 的基对象,不是公共接口,不建议使用
            PyObject* base #  NOT PUBLIC, DO NOT USE !
    
    
    int _import_array() except -1
    # 导入 NumPy C API,返回 -1 表示失败,0 表示成功
    # 这里使用 __pyx_import_array 来避免 _import_array 在使用时被标记为已使用
    
    int __pyx_import_array "_import_array"() except -1
    # 同名函数,用于防止 _import_array 在这里被标记为已使用
    
    #
    # 从 ndarrayobject.h 中提取的宏定义
    #
    
    bint PyArray_CHKFLAGS(ndarray m, int flags) nogil
    # 检查 ndarray 对象 m 的 flags 标志位是否满足条件,不涉及 GIL
    
    bint PyArray_IS_C_CONTIGUOUS(ndarray arr) nogil
    # 检查数组 arr 是否是 C 连续存储的,不涉及 GIL
    
    bint PyArray_IS_F_CONTIGUOUS(ndarray arr) nogil
    # 检查数组 arr 是否是 Fortran 连续存储的,不涉及 GIL
    
    bint PyArray_ISCONTIGUOUS(ndarray m) nogil
    # 检查数组 m 是否是连续存储的,不涉及 GIL
    
    bint PyArray_ISWRITEABLE(ndarray m) nogil
    # 检查数组 m 是否可写,不涉及 GIL
    
    bint PyArray_ISALIGNED(ndarray m) nogil
    # 检查数组 m 是否按照其数据类型的要求对齐,不涉及 GIL
    
    int PyArray_NDIM(ndarray) nogil
    # 返回数组的维度数,不涉及 GIL
    
    bint PyArray_ISONESEGMENT(ndarray) nogil
    # 检查数组是否是一段连续内存,不涉及 GIL
    
    bint PyArray_ISFORTRAN(ndarray) nogil
    # 检查数组是否是 Fortran 风格的存储,不涉及 GIL
    
    int PyArray_FORTRANIF(ndarray) nogil
    # 如果数组是 Fortran 风格的存储,返回 1,否则返回 0,不涉及 GIL
    
    void* PyArray_DATA(ndarray) nogil
    # 返回数组的数据指针,不涉及 GIL
    
    char* PyArray_BYTES(ndarray) nogil
    # 返回数组的数据字节流指针,不涉及 GIL
    
    npy_intp* PyArray_DIMS(ndarray) nogil
    # 返回数组的维度指针,不涉及 GIL
    
    npy_intp* PyArray_STRIDES(ndarray) nogil
    # 返回数组的步长指针,不涉及 GIL
    
    npy_intp PyArray_DIM(ndarray, size_t) nogil
    # 返回数组在指定维度上的大小,不涉及 GIL
    
    npy_intp PyArray_STRIDE(ndarray, size_t) nogil
    # 返回数组在指定维度上的步长,不涉及 GIL
    
    PyObject *PyArray_BASE(ndarray) nogil  # returns borrowed reference!
    # 返回数组的基对象,注意这是借用引用,不涉及 GIL
    
    PyArray_Descr *PyArray_DESCR(ndarray) nogil  # returns borrowed reference to dtype!
    # 返回数组的数据类型描述符,注意这是借用引用,不涉及 GIL
    
    PyArray_Descr *PyArray_DTYPE(ndarray) nogil  # returns borrowed reference to dtype! NP 1.7+ alias for descr.
    # 返回数组的数据类型描述符,这是从 NumPy 1.7+ 开始的别名,不涉及 GIL
    
    int PyArray_FLAGS(ndarray) nogil
    # 返回数组的标志位,不涉及 GIL
    
    void PyArray_CLEARFLAGS(ndarray, int flags) nogil  # Added in NumPy 1.7
    # 清除数组的指定标志位,不涉及 GIL
    
    void PyArray_ENABLEFLAGS(ndarray, int flags) nogil  # Added in NumPy 1.7
    # 启用数组的指定标志位,不涉及 GIL
    
    npy_intp PyArray_ITEMSIZE(ndarray) nogil
    # 返回数组中每个元素的字节大小,不涉及 GIL
    
    int PyArray_TYPE(ndarray arr) nogil
    # 返回数组的数据类型,不涉及 GIL
    
    object PyArray_GETITEM(ndarray arr, void *itemptr)
    # 从数组中获取指定位置的元素,不涉及 GIL
    
    int PyArray_SETITEM(ndarray arr, void *itemptr, object obj) except -1
    # 将对象 obj 设置到数组的指定位置,返回 -1 表示失败,不涉及 GIL
    
    bint PyTypeNum_ISBOOL(int) nogil
    # 检查给定的类型编号是否为布尔类型,不涉及 GIL
    
    bint PyTypeNum_ISUNSIGNED(int) nogil
    # 检查给定的类型编号是否为无符号整数类型,不涉及 GIL
    
    bint PyTypeNum_ISSIGNED(int) nogil
    # 检查给定的类型编号是否为有符号整数类型,不涉及 GIL
    
    bint PyTypeNum_ISINTEGER(int) nogil
    # 检查给定的类型编号是否为整数类型,不涉及 GIL
    
    bint PyTypeNum_ISFLOAT(int) nogil
    # 检查给定的类型编号是否为浮点数类型,不涉及 GIL
    
    bint PyTypeNum_ISNUMBER(int) nogil
    # 检查给定的类型编号是否为数字类型,不涉及 GIL
    
    bint PyTypeNum_ISSTRING(int) nogil
    # 检查给定的类型编号是否为字符串类型,不涉及 GIL
    
    bint PyTypeNum_ISCOMPLEX(int) nogil
    # 检查给定的类型编号是否为复数类型,不涉及 GIL
    
    bint PyTypeNum_ISFLEXIBLE(int) nogil
    # 检查给定的类型编号是否为灵活类型,不涉及 GIL
    
    bint PyTypeNum_ISUSERDEF(int) nogil
    # 检查给定的类型编号是否为用户定义类型,不涉及 GIL
    
    bint PyTypeNum_ISEXTENDED(int) nogil
    # 检查给定的类型编号是否为扩展类型,不涉及 GIL
    
    bint PyTypeNum_ISOBJECT(int) nogil
    # 检查给定的类型编号是否为对象类型,不涉及 GIL
    
    npy_intp PyDataType_ELSIZE(dtype) nogil
    # 返回数据类型的每个元素的字节大小,不涉及 GIL
    
    npy_intp PyDataType_ALIGNMENT(dtype) nogil
    # 返回数据类型的对齐方式,不涉及 GIL
    
    PyObject* PyDataType_METADATA(dtype) nogil
    # 返回数据类型的元数据,不涉及 GIL
    
    PyArray_ArrayDescr* PyDataType_SUBARRAY(dtype) nogil
    # 返回数据类型的子数组描述符,不涉及 GIL
    
    PyObject* PyDataType_NAMES(dtype) nogil
    # 返回数据类型的字段名,不涉及 GIL
    
    PyObject* PyDataType_FIELDS(dtype) nogil
    # 返回数据类型的字段信息,不涉及 GIL
    # 检查数据类型是否为布尔类型
    bint PyDataType_ISBOOL(dtype) nogil
    # 检查数据类型是否为无符号整数类型
    bint PyDataType_ISUNSIGNED(dtype) nogil
    # 检查数据类型是否为有符号整数类型
    bint PyDataType_ISSIGNED(dtype) nogil
    # 检查数据类型是否为整数类型(包括有符号和无符号)
    bint PyDataType_ISINTEGER(dtype) nogil
    # 检查数据类型是否为浮点数类型
    bint PyDataType_ISFLOAT(dtype) nogil
    # 检查数据类型是否为数字类型(包括整数和浮点数)
    bint PyDataType_ISNUMBER(dtype) nogil
    # 检查数据类型是否为字符串类型
    bint PyDataType_ISSTRING(dtype) nogil
    # 检查数据类型是否为复数类型
    bint PyDataType_ISCOMPLEX(dtype) nogil
    # 检查数据类型是否为灵活类型
    bint PyDataType_ISFLEXIBLE(dtype) nogil
    # 检查数据类型是否为用户定义类型
    bint PyDataType_ISUSERDEF(dtype) nogil
    # 检查数据类型是否为扩展类型
    bint PyDataType_ISEXTENDED(dtype) nogil
    # 检查数据类型是否为对象类型
    bint PyDataType_ISOBJECT(dtype) nogil
    # 检查数据类型是否具有字段
    bint PyDataType_HASFIELDS(dtype) nogil
    # 检查数据类型是否具有子数组
    bint PyDataType_HASSUBARRAY(dtype) nogil
    # 获取数据类型的标志位
    npy_uint64 PyDataType_FLAGS(dtype) nogil
    
    # 检查 ndarray 是否为布尔类型数组
    bint PyArray_ISBOOL(ndarray) nogil
    # 检查 ndarray 是否为无符号整数类型数组
    bint PyArray_ISUNSIGNED(ndarray) nogil
    # 检查 ndarray 是否为有符号整数类型数组
    bint PyArray_ISSIGNED(ndarray) nogil
    # 检查 ndarray 是否为整数类型数组(包括有符号和无符号)
    bint PyArray_ISINTEGER(ndarray) nogil
    # 检查 ndarray 是否为浮点数类型数组
    bint PyArray_ISFLOAT(ndarray) nogil
    # 检查 ndarray 是否为数字类型数组(包括整数和浮点数)
    bint PyArray_ISNUMBER(ndarray) nogil
    # 检查 ndarray 是否为字符串类型数组
    bint PyArray_ISSTRING(ndarray) nogil
    # 检查 ndarray 是否为复数类型数组
    bint PyArray_ISCOMPLEX(ndarray) nogil
    # 检查 ndarray 是否为灵活类型数组
    bint PyArray_ISFLEXIBLE(ndarray) nogil
    # 检查 ndarray 是否为用户定义类型数组
    bint PyArray_ISUSERDEF(ndarray) nogil
    # 检查 ndarray 是否为扩展类型数组
    bint PyArray_ISEXTENDED(ndarray) nogil
    # 检查 ndarray 是否为对象类型数组
    bint PyArray_ISOBJECT(ndarray) nogil
    # 检查 ndarray 是否具有字段
    bint PyArray_HASFIELDS(ndarray) nogil
    
    # 检查 ndarray 是否为可变数组(维度不固定)
    bint PyArray_ISVARIABLE(ndarray) nogil
    # 安全地复制内存对齐的 ndarray
    bint PyArray_SAFEALIGNEDCOPY(ndarray) nogil
    # 检查字符是否符合 ndarray 的字节顺序
    bint PyArray_ISNBO(char) nogil              # 适用于 ndarray.byteorder
    # 检查字符是否为本机字节顺序
    bint PyArray_IsNativeByteOrder(char) nogil # 适用于 ndarray.byteorder
    # 检查 ndarray 是否未交换字节顺序
    bint PyArray_ISNOTSWAPPED(ndarray) nogil
    # 检查 ndarray 是否已交换字节顺序
    bint PyArray_ISBYTESWAPPED(ndarray) nogil
    
    # 在给定标志位下交换 ndarray 的字节顺序
    bint PyArray_FLAGSWAP(ndarray, int) nogil
    
    # 检查 ndarray 是否为 C 连续存储
    bint PyArray_ISCARRAY(ndarray) nogil
    # 检查 ndarray 是否为只读的 C 连续存储
    bint PyArray_ISCARRAY_RO(ndarray) nogil
    # 检查 ndarray 是否为 Fortran 连续存储
    bint PyArray_ISFARRAY(ndarray) nogil
    # 检查 ndarray 是否为只读的 Fortran 连续存储
    bint PyArray_ISFARRAY_RO(ndarray) nogil
    # 检查 ndarray 是否表现良好(C 或 Fortran 连续存储)
    bint PyArray_ISBEHAVED(ndarray) nogil
    # 检查 ndarray 是否为只读的表现良好数组(C 或 Fortran 连续存储)
    bint PyArray_ISBEHAVED_RO(ndarray) nogil
    
    # 检查数据类型是否未交换字节顺序
    bint PyDataType_ISNOTSWAPPED(dtype) nogil
    # 检查数据类型是否已交换字节顺序
    bint PyDataType_ISBYTESWAPPED(dtype) nogil
    
    # 检查对象是否符合数组描述符
    bint PyArray_DescrCheck(object)
    
    # 检查对象是否为 ndarray
    bint PyArray_Check(object)
    # 检查对象是否为精确的 ndarray
    bint PyArray_CheckExact(object)
    
    # 检查对象是否为零维数组
    bint PyArray_IsZeroDim(object)
    # 检查对象是否为标量数组
    bint PyArray_CheckScalar(object)
    # 检查对象是否为 Python 数字
    bint PyArray_IsPythonNumber(object)
    # 检查对象是否为 Python 标量
    bint PyArray_IsPythonScalar(object)
    # 检查对象是否为任意标量
    bint PyArray_IsAnyScalar(object)
    # 检查对象是否为任意标量数组
    bint PyArray_CheckAnyScalar(object)
    
    # 获取连续存储的 ndarray
    ndarray PyArray_GETCONTIGUOUS(ndarray)
    # 检查两个 ndarray 是否具有相同的形状
    bint PyArray_SAMESHAPE(ndarray, ndarray) nogil
    # 获取 ndarray 的元素个数
    npy_intp PyArray_SIZE(ndarray) nogil
    # 获取 ndarray 的总字节数
    npy_intp PyArray_NBYTES(ndarray) nogil
    
    # 从对象创建 ndarray
    object PyArray_FROM_O(object)
    # 根据指定标志位从对象创建 ndarray
    object PyArray_FROM_OF(object m, int flags)
    # 根据指定数据类型从对象创建 ndarray
    object PyArray_FROM_OT(object m, int type)
    # 根据指定数据类型和标志位从对象创建 ndarray
    object PyArray_FROM_OTF(object m, int type, int flags)
    # 根据指定数据类型范围和标志位从对象创建 ndarray
    object PyArray_FROMANY(object m, int type, int min, int max, int flags)
    # 创建一个具有指定维度、类型和存储顺序的全零 NumPy 数组
    object PyArray_ZEROS(int nd, npy_intp* dims, int type, int fortran)
    
    # 创建一个具有指定维度、类型和存储顺序的空 NumPy 数组
    object PyArray_EMPTY(int nd, npy_intp* dims, int type, int fortran)
    
    # 用指定的值填充一个 NumPy 数组
    void PyArray_FILLWBYTE(ndarray, int val)
    
    # 从任意对象创建一个连续存储的 NumPy 数组
    object PyArray_ContiguousFromAny(op, int, int min_depth, int max_depth)
    
    # 检查两个数组的类型是否等价
    unsigned char PyArray_EquivArrTypes(ndarray a1, ndarray a2)
    
    # 检查两个字节顺序是否等价
    bint PyArray_EquivByteorders(int b1, int b2) nogil
    
    # 创建一个简单的 NumPy 数组,不初始化其数据
    object PyArray_SimpleNew(int nd, npy_intp* dims, int typenum)
    
    # 使用给定的数据创建一个简单的 NumPy 数组
    object PyArray_SimpleNewFromData(int nd, npy_intp* dims, int typenum, void* data)
    
    # 将数组的数据转换为标量对象
    object PyArray_ToScalar(void* data, ndarray arr)
    
    # 获取一维数组的指定索引处的数据指针
    void* PyArray_GETPTR1(ndarray m, npy_intp i) nogil
    
    # 获取二维数组的指定索引处的数据指针
    void* PyArray_GETPTR2(ndarray m, npy_intp i, npy_intp j) nogil
    
    # 获取三维数组的指定索引处的数据指针
    void* PyArray_GETPTR3(ndarray m, npy_intp i, npy_intp j, npy_intp k) nogil
    
    # 获取四维数组的指定索引处的数据指针
    void* PyArray_GETPTR4(ndarray m, npy_intp i, npy_intp j, npy_intp k, npy_intp l) nogil
    
    # 复制一个 NumPy 数组
    object PyArray_Copy(ndarray)
    
    # 从 Python 对象创建一个 NumPy 数组
    object PyArray_FromObject(object op, int type, int min_depth, int max_depth)
    
    # 从 Python 对象创建一个连续存储的 NumPy 数组
    object PyArray_ContiguousFromObject(object op, int type, int min_depth, int max_depth)
    
    # 从 Python 对象复制数据到 NumPy 数组
    object PyArray_CopyFromObject(object op, int type, int min_depth, int max_depth)
    
    # 将数组转换为指定类型的 NumPy 数组
    object PyArray_Cast(ndarray mp, int type_num)
    
    # 在指定轴上按照给定的索引数组获取数组的子集
    object PyArray_Take(ndarray ap, object items, int axis)
    
    # 在指定位置上按照给定的索引数组放置值到数组中
    object PyArray_Put(ndarray ap, object items, object values)
    
    # 将迭代器重置到起始位置
    void PyArray_ITER_RESET(flatiter it) nogil
    
    # 将迭代器移动到下一个位置
    void PyArray_ITER_NEXT(flatiter it) nogil
    
    # 将迭代器移动到指定位置
    void PyArray_ITER_GOTO(flatiter it, npy_intp* destination) nogil
    
    # 将迭代器移动到一维数组中的指定索引处
    void PyArray_ITER_GOTO1D(flatiter it, npy_intp ind) nogil
    
    # 获取迭代器当前位置的数据指针
    void* PyArray_ITER_DATA(flatiter it) nogil
    
    # 检查迭代器是否还未遍历完所有元素
    bint PyArray_ITER_NOTDONE(flatiter it) nogil
    
    # 将多重迭代器重置到起始位置
    void PyArray_MultiIter_RESET(broadcast multi) nogil
    
    # 将多重迭代器移动到下一个位置
    void PyArray_MultiIter_NEXT(broadcast multi) nogil
    
    # 将多重迭代器移动到指定位置
    void PyArray_MultiIter_GOTO(broadcast multi, npy_intp dest) nogil
    
    # 将多重迭代器移动到一维数组中的指定索引处
    void PyArray_MultiIter_GOTO1D(broadcast multi, npy_intp ind) nogil
    
    # 获取多重迭代器当前位置的数据指针
    void* PyArray_MultiIter_DATA(broadcast multi, npy_intp i) nogil
    
    # 将多重迭代器中的指定迭代器移动到下一个位置
    void PyArray_MultiIter_NEXTi(broadcast multi, npy_intp i) nogil
    
    # 检查多重迭代器是否还未遍历完所有元素
    bint PyArray_MultiIter_NOTDONE(broadcast multi) nogil
    
    # 获取多重迭代器中的数组大小
    npy_intp PyArray_MultiIter_SIZE(broadcast multi) nogil
    
    # 获取多重迭代器中的数组维度数目
    int PyArray_MultiIter_NDIM(broadcast multi) nogil
    
    # 获取多重迭代器当前索引
    npy_intp PyArray_MultiIter_INDEX(broadcast multi) nogil
    
    # 获取多重迭代器中的各维度大小
    npy_intp* PyArray_MultiIter_DIMS(broadcast multi) nogil
    
    # 获取多重迭代器中的所有迭代器
    void** PyArray_MultiIter_ITERS(broadcast multi) nogil
    
    # 增加数组对象的引用计数
    int PyArray_INCREF(ndarray) except *  # 使用 PyArray_Item_INCREF... 增加引用计数
    # 减少 ndarray 对象的引用计数,可能会释放其占用的内存空间
    int PyArray_XDECREF(ndarray) except *
    
    # 根据给定的整数类型创建一个描述符对象
    dtype PyArray_DescrFromType(int)
    
    # 根据给定的整数类型创建一个数组类型对象
    object PyArray_TypeObjectFromType(int)
    
    # 将给定的 ndarray 对象的所有元素置为零
    char * PyArray_Zero(ndarray)
    
    # 将给定的 ndarray 对象的所有元素置为一
    char * PyArray_One(ndarray)
    
    # 判断是否可以安全地将一个整数类型转换为另一个整数类型,可能会写入错误信息
    int PyArray_CanCastSafely(int, int)
    
    # 判断是否可以将一个数据类型安全地转换为另一个数据类型,可能会写入错误信息
    npy_bool PyArray_CanCastTo(dtype, dtype)
    
    # 返回对象的数据类型编号,如果失败则返回 0
    int PyArray_ObjectType(object, int) except 0
    
    # 根据对象推断其对应的描述符对象
    dtype PyArray_DescrFromObject(object, dtype)
    
    # 返回标量对象的描述符对象
    dtype PyArray_DescrFromScalar(object)
    
    # 根据数据类型对象返回其对应的描述符对象
    dtype PyArray_DescrFromTypeObject(object)
    
    # 返回对象的总大小
    npy_intp PyArray_Size(object)
    
    # 将标量对象转换为 C 类型
    void PyArray_ScalarAsCtype(object, void *)
    
    # 返回对象的内存布局优先级
    double PyArray_GetPriority(object, double)  # 清除错误,版本 1.25 后
    
    # 创建一个迭代器对象,用于遍历数组对象
    object PyArray_IterNew(object)
    
    # 创建一个多迭代器对象,用于多数组并行遍历
    object PyArray_MultiIterNew(int, ...)
    
    # 将 Python 中的整数对象转换为 C 语言中的 int 类型,可能会出错返回 -1
    int PyArray_PyIntAsInt(object) except? -1
    
    # 将 Python 中的整数对象转换为 C 语言中的 npy_intp 类型
    npy_intp PyArray_PyIntAsIntp(object)
    
    # 广播数组以匹配指定形状
    int PyArray_Broadcast(broadcast) except -1
    
    # 使用标量对象填充数组的所有元素
    int PyArray_FillWithScalar(ndarray, object) except -1
    
    # 检查数组是否具有正确的步幅
    npy_bool PyArray_CheckStrides(int, int, npy_intp, npy_intp, npy_intp *, npy_intp *)
    # 创建一个新的描述符对象,并设置其字节顺序
    dtype PyArray_DescrNewByteorder (dtype, char)

    # 返回一个迭代器对象,该对象迭代除了指定轴以外的所有元素
    object PyArray_IterAllButAxis (object, int *)

    # 根据给定参数创建一个数组对象,可以接受各种数据类型和格式
    #object PyArray_CheckFromAny (object, dtype, int, int, int, object)

    # 根据给定的 ndarray 对象创建一个新的数组对象,可以指定数据类型
    #object PyArray_FromArray (ndarray, dtype, int)

    # 根据给定的接口对象创建一个数组对象
    object PyArray_FromInterface (object)

    # 根据给定的结构化接口对象创建一个数组对象
    object PyArray_FromStructInterface (object)

    # 根据给定的参数判断是否可以将一个标量转换为指定的数据类型
    #object PyArray_FromArrayAttr (object, dtype, object)

    # 返回给定数据类型和标量类型对应的标量类型种类
    #NPY_SCALARKIND PyArray_ScalarKind (int, ndarray*)

    # 检查是否可以将一个数据类型转换为另一个数据类型
    int PyArray_CanCoerceScalar (int, int, NPY_SCALARKIND)

    # 检查是否可以将一个标量值从一种数据类型转换为另一种数据类型
    npy_bool PyArray_CanCastScalar (type, type)

    # 移除最小的广播形状
    int PyArray_RemoveSmallest (broadcast) except -1

    # 计算给定对象的元素步长
    int PyArray_ElementStrides (object)

    # 增加数组元素的引用计数
    void PyArray_Item_INCREF (char *, dtype) except *

    # 减少数组元素的引用计数
    void PyArray_Item_XDECREF (char *, dtype) except *

    # 返回数组的转置
    object PyArray_Transpose (ndarray, PyArray_Dims *)

    # 根据给定的索引数组从数组中取值
    object PyArray_TakeFrom (ndarray, object, int, ndarray, NPY_CLIPMODE)

    # 将数组中的值放置到给定的索引位置
    object PyArray_PutTo (ndarray, object, object, NPY_CLIPMODE)

    # 根据掩码数组将值放置到数组中
    object PyArray_PutMask (ndarray, object, object)

    # 返回重复给定数组后的结果数组
    object PyArray_Repeat (ndarray, object, int)

    # 根据给定数组和索引数组选择值
    object PyArray_Choose (ndarray, object, ndarray, NPY_CLIPMODE)

    # 对数组进行排序
    int PyArray_Sort (ndarray, int, NPY_SORTKIND) except -1

    # 返回数组排序的索引
    object PyArray_ArgSort (ndarray, int, NPY_SORTKIND)

    # 在数组中搜索指定值,并返回索引
    object PyArray_SearchSorted (ndarray, object, NPY_SEARCHSIDE, PyObject *)

    # 返回数组的最大值的索引
    object PyArray_ArgMax (ndarray, int, ndarray)

    # 返回数组的最小值的索引
    object PyArray_ArgMin (ndarray, int, ndarray)

    # 返回给定形状的数组视图
    object PyArray_Reshape (ndarray, object)

    # 返回给定形状和顺序的新数组对象
    object PyArray_Newshape (ndarray, PyArray_Dims *, NPY_ORDER)

    # 返回去除长度为 1 的轴后的数组视图
    object PyArray_Squeeze (ndarray)

    # 返回数组的视图,不改变数组数据的形状
    #object PyArray_View (ndarray, dtype, type)

    # 交换数组的两个轴
    object PyArray_SwapAxes (ndarray, int, int)

    # 返回数组在指定轴上的最大值
    object PyArray_Max (ndarray, int, ndarray)

    # 返回数组在指定轴上的最小值
    object PyArray_Min (ndarray, int, ndarray)

    # 返回数组在指定轴上的最大值与最小值之差
    object PyArray_Ptp (ndarray, int, ndarray)

    # 返回数组在指定轴上的均值
    object PyArray_Mean (ndarray, int, int, ndarray)

    # 返回数组的对角线元素
    object PyArray_Trace (ndarray, int, int, int, int, ndarray)

    # 返回数组的对角线
    object PyArray_Diagonal (ndarray, int, int, int)

    # 返回数组在指定范围内的数值剪裁结果
    object PyArray_Clip (ndarray, object, object, ndarray)

    # 返回数组的共轭视图
    object PyArray_Conjugate (ndarray, ndarray)

    # 返回数组中非零元素的索引
    object PyArray_Nonzero (ndarray)

    # 返回数组在指定轴上的标准差
    object PyArray_Std (ndarray, int, int, ndarray, int)

    # 返回数组在指定轴上的总和
    object PyArray_Sum (ndarray, int, int, ndarray)

    # 返回数组在指定轴上的累积和
    object PyArray_CumSum (ndarray, int, int, ndarray)

    # 返回数组在指定轴上的积
    object PyArray_Prod (ndarray, int, int, ndarray)

    # 返回数组在指定轴上的累积积
    object PyArray_CumProd (ndarray, int, int, ndarray)

    # 判断数组中所有元素是否为真
    object PyArray_All (ndarray, int, ndarray)

    # 判断数组中是否有任意一个元素为真
    object PyArray_Any (ndarray, int, ndarray)

    # 返回根据条件数组对数组进行压缩后的结果数组
    object PyArray_Compress (ndarray, object, int, ndarray)

    # 返回按照指定顺序展平数组的结果数组
    object PyArray_Flatten (ndarray, NPY_ORDER)

    # 返回按照指定顺序展平数组的结果视图
    object PyArray_Ravel (ndarray, NPY_ORDER)

    # 返回给定整数列表中所有元素的乘积
    npy_intp PyArray_MultiplyList (npy_intp *, int)

    # 返回给定整数列表中所有整数的乘积
    int PyArray_MultiplyIntList (int *, int)

    # 返回数组中指定索引处元素的指针
    void * PyArray_GetPtr (ndarray, npy_intp*)

    # 比较两个整数列表是否相等
    int PyArray_CompareLists (npy_intp *, npy_intp *, int)

    # 将一个对象转换为 C 风格数组
    #int PyArray_AsCArray (object*, void *, npy_intp *, int, dtype)

    # 释放使用 PyArray_AsCArray() 分配的内存
    int PyArray_Free (object, void *)

    # 转换一个对象为数组
    #int PyArray_Converter (object, object*)
    int PyArray_IntpFromSequence (object, npy_intp *, int) except -1
        # 从 Python 序列中提取整数数组,存储在 npy_intp 类型的数组中
        # 参数:
        #   object: 输入的 Python 对象,应当是一个序列
        #   npy_intp *: 用于存储整数的数组指针
        #   int: 数组的长度
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    object PyArray_Concatenate (object, int)
        # 拼接多个数组成一个数组
        # 参数:
        #   object: 输入的 Python 对象,应当是包含待拼接数组的元组
        #   int: 要拼接的数组的轴(维度)
        # 返回值:
        #   拼接后的数组对象
    
    object PyArray_InnerProduct (object, object)
        # 计算两个数组的内积
        # 参数:
        #   object: 第一个输入的数组对象
        #   object: 第二个输入的数组对象
        # 返回值:
        #   内积的结果数组对象
    
    object PyArray_MatrixProduct (object, object)
        # 计算两个数组的矩阵乘积
        # 参数:
        #   object: 第一个输入的数组对象
        #   object: 第二个输入的数组对象
        # 返回值:
        #   矩阵乘积的结果数组对象
    
    object PyArray_Correlate (object, object, int)
        # 计算两个数组的相关性
        # 参数:
        #   object: 第一个输入的数组对象
        #   object: 第二个输入的数组对象
        #   int: 相关计算的模式
        # 返回值:
        #   相关性计算结果的数组对象
    
    #int PyArray_DescrConverter (object, dtype*) except 0
    #int PyArray_DescrConverter2 (object, dtype*) except 0
        # 用于转换数组描述符的函数,已废弃
    
    int PyArray_IntpConverter (object, PyArray_Dims *) except 0
        # 将 Python 对象转换为 PyArray_Dims 结构,该结构用于表示数组的维度信息
        # 参数:
        #   object: 输入的 Python 对象
        #   PyArray_Dims *: 用于存储维度信息的指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    #int PyArray_BufferConverter (object, chunk) except 0
        # 用于转换缓冲区对象的函数,已废弃
    
    int PyArray_AxisConverter (object, int *) except 0
        # 将 Python 对象转换为整数,表示数组的轴
        # 参数:
        #   object: 输入的 Python 对象
        #   int *: 用于存储轴值的指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    int PyArray_BoolConverter (object, npy_bool *) except 0
        # 将 Python 对象转换为布尔值,表示数组的布尔值
        # 参数:
        #   object: 输入的 Python 对象
        #   npy_bool *: 用于存储布尔值的指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    int PyArray_ByteorderConverter (object, char *) except 0
        # 将 Python 对象转换为字符,表示数组的字节顺序
        # 参数:
        #   object: 输入的 Python 对象
        #   char *: 用于存储字节顺序的指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    int PyArray_OrderConverter (object, NPY_ORDER *) except 0
        # 将 Python 对象转换为 NPY_ORDER 枚举值,表示数组的存储顺序
        # 参数:
        #   object: 输入的 Python 对象
        #   NPY_ORDER *: 用于存储存储顺序的指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    unsigned char PyArray_EquivTypes (dtype, dtype)
        # 检查两个数据类型是否等效
        # 参数:
        #   dtype: 第一个数据类型
        #   dtype: 第二个数据类型
        # 返回值:
        #   若数据类型等效则返回非零值,否则返回零
    
    #object PyArray_Zeros (int, npy_intp *, dtype, int)
    #object PyArray_Empty (int, npy_intp *, dtype, int)
        # 创建数组对象的函数,已废弃
    
    object PyArray_Where (object, object, object)
        # 根据条件返回数组中满足条件的元素
        # 参数:
        #   object: 条件数组对象
        #   object: 真值数组对象
        #   object: 假值数组对象
        # 返回值:
        #   满足条件的元素组成的数组对象
    
    object PyArray_Arange (double, double, double, int)
        # 创建等差数列的数组对象
        # 参数:
        #   double: 开始值
        #   double: 结束值
        #   double: 步长
        #   int: 数据类型
        # 返回值:
        #   创建的等差数列数组对象
    
    int PyArray_SortkindConverter (object, NPY_SORTKIND *) except 0
        # 将 Python 对象转换为 NPY_SORTKIND 枚举值,表示排序方式
        # 参数:
        #   object: 输入的 Python 对象
        #   NPY_SORTKIND *: 用于存储排序方式的指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    object PyArray_LexSort (object, int)
        # 对多个数组进行词典排序
        # 参数:
        #   object: 输入的元组,包含待排序的多个数组对象
        #   int: 用于指定排序的轴
        # 返回值:
        #   排序结果的数组对象
    
    object PyArray_Round (ndarray, int, ndarray)
        # 对数组进行四舍五入
        # 参数:
        #   ndarray: 输入的数组对象
        #   int: 四舍五入的小数位数
        #   ndarray: 用于存储结果的数组对象
        # 返回值:
        #   四舍五入后的数组对象
    
    unsigned char PyArray_EquivTypenums (int, int)
        # 检查两个数据类型编号是否等效
        # 参数:
        #   int: 第一个数据类型编号
        #   int: 第二个数据类型编号
        # 返回值:
        #   若数据类型编号等效则返回非零值,否则返回零
    
    int PyArray_RegisterDataType (dtype) except -1
        # 注册新的数据类型
        # 参数:
        #   dtype: 待注册的数据类型
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    int PyArray_RegisterCastFunc (dtype, int, PyArray_VectorUnaryFunc *) except -1
        # 注册新的类型转换函数
        # 参数:
        #   dtype: 待注册的数据类型
        #   int: 源数据类型编号
        #   PyArray_VectorUnaryFunc *: 类型转换函数指针
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    int PyArray_RegisterCanCast (dtype, int, NPY_SCALARKIND) except -1
        # 注册新的数据类型转换能力
        # 参数:
        #   dtype: 目标数据类型
        #   int: 源数据类型编号
        #   NPY_SCALARKIND: 标量类型
        # 返回值:
        #   成功时返回 0,失败时返回 -1
    
    #void PyArray_InitArrFuncs (PyArray_ArrFuncs *)
        # 初始化数组函数,已废弃
    
    object PyArray_IntTupleFromIntp (int, npy_intp *)
        # 将整数数组转换为整数元组
        # 参数:
        #   int: 数组的长度
        #   npy_intp *: 输入的整数数组
        # 返回值:
# Typedefs that matches the runtime dtype objects in
# the numpy module.

# The ones that are commented out needs an IFDEF function
# in Cython to enable them only on the right systems.

# 定义与 numpy 模块中运行时数据类型对象相匹配的类型别名

ctypedef npy_int8       int8_t
ctypedef npy_int16      int16_t
ctypedef npy_int32      int32_t
ctypedef npy_int64      int64_t
#ctypedef npy_int96      int96_t
#ctypedef npy_int128     int128_t

ctypedef npy_uint8      uint8_t
ctypedef npy_uint16     uint16_t
ctypedef npy_uint32     uint32_t
ctypedef npy_uint64     uint64_t
#ctypedef npy_uint96     uint96_t
#ctypedef npy_uint128    uint128_t

ctypedef npy_float32    float32_t
ctypedef npy_float64    float64_t
#ctypedef npy_float80    float80_t
#ctypedef npy_float128   float128_t

ctypedef float complex  complex64_t
ctypedef double complex complex128_t

ctypedef npy_longlong   longlong_t
ctypedef npy_ulonglong  ulonglong_t

ctypedef npy_intp       intp_t
ctypedef npy_uintp      uintp_t

ctypedef npy_double     float_t
ctypedef npy_double     double_t
ctypedef npy_longdouble longdouble_t

ctypedef float complex       cfloat_t
ctypedef double complex      cdouble_t
ctypedef double complex      complex_t
ctypedef long double complex clongdouble_t

# 定义各种数值类型的类型别名,以匹配 numpy 模块中的相应数据类型

cdef inline object PyArray_MultiIterNew1(a):
    return PyArray_MultiIterNew(1, <void*>a)

cdef inline object PyArray_MultiIterNew2(a, b):
    return PyArray_MultiIterNew(2, <void*>a, <void*>b)

cdef inline object PyArray_MultiIterNew3(a, b, c):
    return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)

cdef inline object PyArray_MultiIterNew4(a, b, c, d):
    return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)

cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
    return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)

# 定义 Cython 中的内联函数,用于创建多迭代器对象,参数数量从1到5不等

cdef inline tuple PyDataType_SHAPE(dtype d):
    if PyDataType_HASSUBARRAY(d):
        return <tuple>d.subarray.shape
    else:
        return ()

# 定义 Cython 中的内联函数,用于获取给定数据类型的形状信息,若是子数组则返回其形状,否则返回空元组

cdef extern from "numpy/ndarrayobject.h":
    PyTypeObject PyTimedeltaArrType_Type
    PyTypeObject PyDatetimeArrType_Type
    ctypedef int64_t npy_timedelta
    ctypedef int64_t npy_datetime

# 从 numpy/ndarrayobject.h 头文件导入内容:定义了时间增量和日期时间类型的 PyTypeObject 结构体,以及对应的时间增量和日期时间的类型别名

cdef extern from "numpy/ndarraytypes.h":
    ctypedef struct PyArray_DatetimeMetaData:
        NPY_DATETIMEUNIT base
        int64_t num

    ctypedef struct npy_datetimestruct:
        int64_t year
        int32_t month, day, hour, min, sec, us, ps, as

# 从 numpy/ndarraytypes.h 头文件导入内容:定义了日期时间元数据结构 PyArray_DatetimeMetaData 和日期时间结构 npy_datetimestruct 的结构体定义

cdef extern from "numpy/arrayscalars.h":

    # abstract types
    ctypedef class numpy.generic [object PyObject]:
        pass
    ctypedef class numpy.number [object PyObject]:
        pass
    ctypedef class numpy.integer [object PyObject]:
        pass
    ctypedef class numpy.signedinteger [object PyObject]:
        pass
    ctypedef class numpy.unsignedinteger [object PyObject]:
        pass
    ctypedef class numpy.inexact [object PyObject]:
        pass
    ctypedef class numpy.floating [object PyObject]:
        pass
    ctypedef class numpy.complexfloating [object PyObject]:
        pass

# 从 numpy/arrayscalars.h 头文件导入内容:定义了一系列 numpy 抽象类型的类定义
    # 定义一个 Cython 类型的声明,表示 numpy 的 flexible 类型,继承自 object PyObject
    ctypedef class numpy.flexible [object PyObject]:
        pass
    
    # 定义一个 Cython 类型的声明,表示 numpy 的 character 类型,继承自 object PyObject
    ctypedef class numpy.character [object PyObject]:
        pass
    
    # 定义一个 Cython 结构体,表示 Python 中的 datetime 标量对象
    ctypedef struct PyDatetimeScalarObject:
        # PyObject_HEAD
        # 日期时间值
        npy_datetime obval
        # 日期时间的元数据
        PyArray_DatetimeMetaData obmeta
    
    # 定义一个 Cython 结构体,表示 Python 中的 timedelta 标量对象
    ctypedef struct PyTimedeltaScalarObject:
        # PyObject_HEAD
        # 时间增量值
        npy_timedelta obval
        # 时间增量的元数据
        PyArray_DatetimeMetaData obmeta
    
    # 定义一个 Cython 枚举类型,表示 numpy 的日期时间单位
    ctypedef enum NPY_DATETIMEUNIT:
        NPY_FR_Y   # 年
        NPY_FR_M   # 月
        NPY_FR_W   # 周
        NPY_FR_D   # 日
        NPY_FR_B   # 工作日
        NPY_FR_h   # 小时
        NPY_FR_m   # 分钟
        NPY_FR_s   # 秒
        NPY_FR_ms  # 毫秒
        NPY_FR_us  # 微秒
        NPY_FR_ns  # 纳秒
        NPY_FR_ps  # 皮秒
        NPY_FR_fs  # 飞秒
        NPY_FR_as  # 阿秒
        NPY_FR_GENERIC  # 通用时间单位
cdef extern from "numpy/arrayobject.h":
    # 导入 NumPy 的 C-API 头文件 "numpy/arrayobject.h"

    # 定义在 datetime_strings.c 中的 NumPy 内部函数:
    # 返回 ISO 8601 格式日期时间字符串的长度
    int get_datetime_iso_8601_strlen "NpyDatetime_GetDatetimeISO8601StrLen" (
            int local, NPY_DATETIMEUNIT base)
    
    # 创建 ISO 8601 格式日期时间字符串
    int make_iso_8601_datetime "NpyDatetime_MakeISO8601Datetime" (
            npy_datetimestruct *dts, char *outstr, npy_intp outlen,
            int local, int utc, NPY_DATETIMEUNIT base, int tzoffset,
            NPY_CASTING casting) except -1

    # 定义在 datetime.c 中的 NumPy 内部函数:
    # 将 Python 的 datetime 对象转换为 npy_datetimestruct 结构
    int convert_pydatetime_to_datetimestruct "NpyDatetime_ConvertPyDateTimeToDatetimeStruct" (
            PyObject *obj, npy_datetimestruct *out,
            NPY_DATETIMEUNIT *out_bestunit, int apply_tzinfo) except -1
    
    # 将 datetime64 转换为 npy_datetimestruct 结构
    int convert_datetime64_to_datetimestruct "NpyDatetime_ConvertDatetime64ToDatetimeStruct" (
            PyArray_DatetimeMetaData *meta, npy_datetime dt,
            npy_datetimestruct *out) except -1
    
    # 将 npy_datetimestruct 结构转换为 datetime64
    int convert_datetimestruct_to_datetime64 "NpyDatetime_ConvertDatetimeStructToDatetime64"(
            PyArray_DatetimeMetaData *meta, const npy_datetimestruct *dts,
            npy_datetime *out) except -1


#
# ufunc API
#

cdef extern from "numpy/ufuncobject.h":
    # 导入 NumPy 的 C-API 头文件 "numpy/ufuncobject.h"

    ctypedef void (*PyUFuncGenericFunction) (char **, npy_intp *, npy_intp *, void *)

    ctypedef class numpy.ufunc [object PyUFuncObject, check_size ignore]:
        cdef:
            int nin, nout, nargs
            int identity
            PyUFuncGenericFunction *functions
            void **data
            int ntypes
            int check_return
            char *name
            char *types
            char *doc
            void *ptr
            PyObject *obj
            PyObject *userloops

    cdef enum:
        PyUFunc_Zero
        PyUFunc_One
        PyUFunc_None
        UFUNC_FPE_DIVIDEBYZERO
        UFUNC_FPE_OVERFLOW
        UFUNC_FPE_UNDERFLOW
        UFUNC_FPE_INVALID

    # 创建一个 ufunc 对象并注册其函数和数据
    object PyUFunc_FromFuncAndData(PyUFuncGenericFunction *,
          void **, char *, int, int, int, int, char *, char *, int)
    
    # 为特定数据类型注册一个循环函数
    int PyUFunc_RegisterLoopForType(ufunc, int,
                                    PyUFuncGenericFunction, int *, void *) except -1
    
    # 定义一系列 ufunc 函数,每个函数对应不同的数据类型转换和操作
    void PyUFunc_f_f_As_d_d \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_d_d \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_f_f \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_g_g \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_F_F_As_D_D \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_F_F \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_D_D \
         (char **, npy_intp *, npy_intp *, void *)
    void PyUFunc_G_G \
         (char **, npy_intp *, npy_intp *, void *)
    # 定义接受一个字符指针、两个整型指针和一个空指针参数的 PyUFunc_O_O 函数
    void PyUFunc_O_O \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受六个字符指针、三个整型指针和一个空指针参数的 PyUFunc_ff_f_As_dd_d 函数
    void PyUFunc_ff_f_As_dd_d \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受三个字符指针、两个整型指针和一个空指针参数的 PyUFunc_ff_f 函数
    void PyUFunc_ff_f \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受三个字符指针、两个整型指针和一个空指针参数的 PyUFunc_dd_d 函数
    void PyUFunc_dd_d \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受三个字符指针、两个整型指针和一个空指针参数的 PyUFunc_gg_g 函数
    void PyUFunc_gg_g \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受六个字符指针、三个整型指针和一个空指针参数的 PyUFunc_FF_F_As_DD_D 函数
    void PyUFunc_FF_F_As_DD_D \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受三个字符指针、两个整型指针和一个空指针参数的 PyUFunc_DD_D 函数
    void PyUFunc_DD_D \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受三个字符指针、两个整型指针和一个空指针参数的 PyUFunc_FF_F 函数
    void PyUFunc_FF_F \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受三个字符指针、两个整型指针和一个空指针参数的 PyUFunc_GG_G 函数
    void PyUFunc_GG_G \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受一个字符指针、两个整型指针和一个空指针参数的 PyUFunc_OO_O 函数
    void PyUFunc_OO_O \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受一个字符指针、两个整型指针和一个空指针参数的 PyUFunc_O_O_method 函数
    void PyUFunc_O_O_method \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受两个字符指针、两个整型指针和一个空指针参数的 PyUFunc_OO_O_method 函数
    void PyUFunc_OO_O_method \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 定义接受一个字符指针、两个整型指针和一个空指针参数的 PyUFunc_On_Om 函数
    void PyUFunc_On_Om \
         (char **, npy_intp *, npy_intp *, void *)
    
    # 声明清除浮点错误状态的 PyUFunc_clearfperr 函数
    void PyUFunc_clearfperr()
    
    # 声明获取当前浮点错误状态的 PyUFunc_getfperr 函数
    int PyUFunc_getfperr()
    
    # 定义接受一个 ufunc 对象、一个 PyUFuncGenericFunction 指针、一个整型指针和一个 PyUFuncGenericFunction 指针参数的 PyUFunc_ReplaceLoopBySignature 函数
    int PyUFunc_ReplaceLoopBySignature \
        (ufunc, PyUFuncGenericFunction, int *, PyUFuncGenericFunction *)
    
    # 定义接受一个 PyUFuncGenericFunction 指针数组、一个空指针数组、一个字符串、五个整型参数和三个字符参数的 PyUFunc_FromFuncAndDataAndSignature 函数
    object PyUFunc_FromFuncAndDataAndSignature \
             (PyUFuncGenericFunction *, void **, char *, int, int, int,
              int, char *, char *, int, char *)
    
    # 声明调用 _import_umath 函数并捕获异常,返回值为 -1
    int _import_umath() except -1
# 声明一个内联函数,用于设置数组的基对象
cdef inline void set_array_base(ndarray arr, object base):
    # 增加基对象的引用计数,确保在下面窃取引用之前执行此操作!
    Py_INCREF(base)
    # 设置数组的基对象为指定的 base 对象
    PyArray_SetBaseObject(arr, base)

# 声明一个内联函数,用于获取数组的基对象
cdef inline object get_array_base(ndarray arr):
    # 获取数组的基对象
    base = PyArray_BASE(arr)
    # 如果基对象为空,则返回 None
    if base is NULL:
        return None
    # 否则,返回基对象转换为 Python 对象的结果
    return <object>base

# 下面是更适合于 Cython 代码的 import_* 函数版本。

# 声明一个内联函数,用于导入 numpy 库
cdef inline int import_array() except -1:
    try:
        # 调用 Cython 专用的 __pyx_import_array() 函数来导入 numpy 库
        __pyx_import_array()
    except Exception:
        # 如果导入失败,则抛出 ImportError 异常
        raise ImportError("numpy._core.multiarray failed to import")

# 声明一个内联函数,用于导入 umath 模块
cdef inline int import_umath() except -1:
    try:
        # 调用 _import_umath() 函数来导入 umath 模块
        _import_umath()
    except Exception:
        # 如果导入失败,则抛出 ImportError 异常
        raise ImportError("numpy._core.umath failed to import")

# 声明一个内联函数,用于导入 ufunc 模块
cdef inline int import_ufunc() except -1:
    try:
        # 调用 _import_umath() 函数来导入 umath 模块
        _import_umath()
    except Exception:
        # 如果导入失败,则抛出 ImportError 异常
        raise ImportError("numpy._core.umath failed to import")

# 声明一个内联函数,用于判断对象是否为 timedelta64 类型
cdef inline bint is_timedelta64_object(object obj):
    """
    Cython 的等价函数,用于检查 obj 是否为 np.timedelta64 类型的实例

    Parameters
    ----------
    obj : object

    Returns
    -------
    bool
    """
    return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type)

# 声明一个内联函数,用于判断对象是否为 datetime64 类型
cdef inline bint is_datetime64_object(object obj):
    """
    Cython 的等价函数,用于检查 obj 是否为 np.datetime64 类型的实例

    Parameters
    ----------
    obj : object

    Returns
    -------
    bool
    """
    return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type)

# 声明一个内联函数,用于获取 numpy datetime64 对象的 int64 值
cdef inline npy_datetime get_datetime64_value(object obj) nogil:
    """
    返回标量 numpy datetime64 对象下层的 int64 值

    注意,要解释为 datetime,还需要对应的单位,可以使用 get_datetime64_unit 获取单位信息。
    """
    return (<PyDatetimeScalarObject*>obj).obval

# 声明一个内联函数,用于获取 numpy timedelta64 对象的 int64 值
cdef inline npy_timedelta get_timedelta64_value(object obj) nogil:
    """
    返回标量 numpy timedelta64 对象下层的 int64 值
    """
    return (<PyTimedeltaScalarObject*>obj).obval

# 声明一个内联函数,用于获取 numpy datetime64 对象的单位信息
cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil:
    """
    返回 numpy datetime64 对象的 dtype 中的单位部分信息
    """
    return <NPY_DATETIMEUNIT>(<PyDatetimeScalarObject*>obj).obmeta.base

# 在 numpy 1.6 中新增的迭代器 API
ctypedef int (*NpyIter_IterNextFunc)(NpyIter* it) noexcept nogil
ctypedef void (*NpyIter_GetMultiIndexFunc)(NpyIter* it, npy_intp* outcoords) noexcept nogil

# 从 "numpy/arrayobject.h" 头文件中导入相关定义
cdef extern from "numpy/arrayobject.h":

    # 定义 NpyIter 结构体
    ctypedef struct NpyIter:
        pass

    # 定义 NPY_FAIL 和 NPY_SUCCEED 常量
    cdef enum:
        NPY_FAIL
        NPY_SUCCEED
    # 定义枚举类型,用于迭代器追踪不同的标志位

    # 表示 C 顺序的索引
    NPY_ITER_C_INDEX
    # 表示 Fortran 顺序的索引
    NPY_ITER_F_INDEX
    # 表示多维索引
    NPY_ITER_MULTI_INDEX
    # 外部用户代码执行一维最内层循环
    NPY_ITER_EXTERNAL_LOOP
    # 将所有操作数转换为共同的数据类型
    NPY_ITER_COMMON_DTYPE
    # 操作数可能包含引用,在迭代期间需要 API 访问
    NPY_ITER_REFS_OK
    # 允许零大小的操作数,迭代时检查 IterSize 是否为 0
    NPY_ITER_ZEROSIZE_OK
    # 允许进行约简操作(大小为 0 的步幅,但维度大小 > 1)
    NPY_ITER_REDUCE_OK
    # 启用子范围迭代
    NPY_ITER_RANGED
    # 启用缓冲区
    NPY_ITER_BUFFERED
    # 当启用缓冲区时,尽可能增长内部循环
    NPY_ITER_GROWINNER
    # 延迟分配缓冲区,直到第一次 Reset* 调用
    NPY_ITER_DELAY_BUFALLOC
    # 当指定 NPY_KEEPORDER 时,禁用反转负步幅轴
    NPY_ITER_DONT_NEGATE_STRIDES
    NPY_ITER_COPY_IF_OVERLAP
    # 操作数将被读取和写入
    NPY_ITER_READWRITE
    # 操作数只能被读取
    NPY_ITER_READONLY
    # 操作数只能被写入
    NPY_ITER_WRITEONLY
    # 操作数的数据必须是本机字节顺序
    NPY_ITER_NBO
    # 操作数的数据必须是对齐的
    NPY_ITER_ALIGNED
    # 操作数的数据必须是连续的(在内部循环内)
    NPY_ITER_CONTIG
    # 可能复制操作数以满足要求
    NPY_ITER_COPY
    # 可能使用 WRITEBACKIFCOPY 复制操作数以满足要求
    NPY_ITER_UPDATEIFCOPY
    # 如果操作数为 NULL,则分配它
    NPY_ITER_ALLOCATE
    # 如果分配了操作数,则不使用任何子类型
    NPY_ITER_NO_SUBTYPE
    # 这是一个虚拟数组插槽,操作数为 NULL,但临时数据在那里
    NPY_ITER_VIRTUAL
    # 要求维度与迭代器维度完全匹配
    NPY_ITER_NO_BROADCAST
    # 此数组正在使用掩码,影响缓冲区到数组的复制
    NPY_ITER_WRITEMASKED
    # 此数组是所有 WRITEMASKED 操作数的掩码
    NPY_ITER_ARRAYMASK
    # 假定对 COPY_IF_OVERLAP 进行元素级访问的迭代器顺序数据访问
    NPY_ITER_OVERLAP_ASSUME_ELEMENTWISE

    # 构造和销毁函数

    # 创建新的迭代器对象
    NpyIter* NpyIter_New(ndarray arr, npy_uint32 flags, NPY_ORDER order,
                         NPY_CASTING casting, dtype datatype) except NULL
    # 创建新的多重迭代器对象
    NpyIter* NpyIter_MultiNew(npy_intp nop, PyArrayObject** op, npy_uint32 flags,
                              NPY_ORDER order, NPY_CASTING casting, npy_uint32*
                              op_flags, PyArray_Descr** op_dtypes) except NULL
    // 创建一个新的 NpyIter 对象,具有高级配置选项
    NpyIter* NpyIter_AdvancedNew(npy_intp nop,           // 操作数的数量
                                 PyArrayObject** op,     // 操作数对象的指针数组
                                 npy_uint32 flags,       // 迭代器的标志
                                 NPY_ORDER order,        // 迭代的顺序
                                 NPY_CASTING casting,    // 类型转换方式
                                 npy_uint32* op_flags,   // 操作数的标志数组
                                 PyArray_Descr** op_dtypes, // 操作数的数据类型数组
                                 int oa_ndim,            // 操作数轴的数量
                                 int** op_axes,          // 操作数轴的数组的指针
                                 const npy_intp* itershape, // 迭代器的形状
                                 npy_intp buffersize)    // 缓冲区的大小
                                 except NULL
    
    // 复制一个现有的 NpyIter 对象,返回新的对象
    NpyIter* NpyIter_Copy(NpyIter* it) except NULL
    
    // 移除指定轴上的迭代
    int NpyIter_RemoveAxis(NpyIter* it, int axis) except NPY_FAIL
    
    // 移除多索引迭代
    int NpyIter_RemoveMultiIndex(NpyIter* it) except NPY_FAIL
    
    // 启用外部循环模式
    int NpyIter_EnableExternalLoop(NpyIter* it) except NPY_FAIL
    
    // 释放 NpyIter 对象的内存
    int NpyIter_Deallocate(NpyIter* it) except NPY_FAIL
    
    // 重置迭代器状态
    int NpyIter_Reset(NpyIter* it, char** errmsg) except NPY_FAIL
    
    // 重置到指定迭代索引范围
    int NpyIter_ResetToIterIndexRange(NpyIter* it, npy_intp istart, npy_intp iend, char** errmsg) except NPY_FAIL
    
    // 重置基础指针数组
    int NpyIter_ResetBasePointers(NpyIter* it, char** baseptrs, char** errmsg) except NPY_FAIL
    
    // 跳转到指定多索引位置
    int NpyIter_GotoMultiIndex(NpyIter* it, const npy_intp* multi_index) except NPY_FAIL
    
    // 跳转到指定索引位置
    int NpyIter_GotoIndex(NpyIter* it, npy_intp index) except NPY_FAIL
    
    // 获取迭代器的总大小
    npy_intp NpyIter_GetIterSize(NpyIter* it) nogil
    
    // 获取当前迭代的索引
    npy_intp NpyIter_GetIterIndex(NpyIter* it) nogil
    
    // 获取迭代索引范围
    void NpyIter_GetIterIndexRange(NpyIter* it, npy_intp* istart, npy_intp* iend) nogil
    
    // 跳转到指定迭代索引
    int NpyIter_GotoIterIndex(NpyIter* it, npy_intp iterindex) except NPY_FAIL
    
    // 判断是否需要延迟缓冲区分配
    npy_bool NpyIter_HasDelayedBufAlloc(NpyIter* it) nogil
    
    // 判断是否启用外部循环
    npy_bool NpyIter_HasExternalLoop(NpyIter* it) nogil
    
    // 判断是否具有多索引
    npy_bool NpyIter_HasMultiIndex(NpyIter* it) nogil
    
    // 判断是否具有索引
    npy_bool NpyIter_HasIndex(NpyIter* it) nogil
    
    // 判断是否需要缓冲区
    npy_bool NpyIter_RequiresBuffering(NpyIter* it) nogil
    
    // 判断是否已缓冲
    npy_bool NpyIter_IsBuffered(NpyIter* it) nogil
    
    // 判断是否为增长内部迭代
    npy_bool NpyIter_IsGrowInner(NpyIter* it) nogil
    
    // 获取缓冲区大小
    npy_intp NpyIter_GetBufferSize(NpyIter* it) nogil
    
    // 获取迭代器的维度数
    int NpyIter_GetNDim(NpyIter* it) nogil
    
    // 获取操作数的数量
    int NpyIter_GetNOp(NpyIter* it) nogil
    
    // 获取指定轴的步幅数组
    npy_intp* NpyIter_GetAxisStrideArray(NpyIter* it, int axis) except NULL
    
    // 获取迭代器的形状
    int NpyIter_GetShape(NpyIter* it, npy_intp* outshape) nogil
    
    // 获取操作数的数据类型数组
    PyArray_Descr** NpyIter_GetDescrArray(NpyIter* it)
    
    // 获取操作数对象的指针数组
    PyArrayObject** NpyIter_GetOperandArray(NpyIter* it)
    
    // 获取指定迭代索引的迭代视图
    ndarray NpyIter_GetIterView(NpyIter* it, npy_intp i)
    
    // 获取读取标志
    void NpyIter_GetReadFlags(NpyIter* it, char* outreadflags)
    
    // 获取写入标志
    void NpyIter_GetWriteFlags(NpyIter* it, char* outwriteflags)
    
    // 创建兼容步幅数组
    int NpyIter_CreateCompatibleStrides(NpyIter* it, npy_intp itemsize, npy_intp* outstrides) except NPY_FAIL
    
    // 判断是否是第一次访问指定操作数
    npy_bool NpyIter_IsFirstVisit(NpyIter* it, int iop) nogil
    
    // 获取迭代器的下一个迭代函数
    NpyIter_IterNextFunc* NpyIter_GetIterNext(NpyIter* it, char** errmsg) except NULL
    
    // 获取获取多索引的函数
    NpyIter_GetMultiIndexFunc* NpyIter_GetGetMultiIndex(NpyIter* it, char** errmsg) except NULL
    # 获取当前迭代器 `it` 的数据指针数组,在不使用全局解释器锁(GIL)的情况下
    char** NpyIter_GetDataPtrArray(NpyIter* it) nogil
    
    # 获取迭代器 `it` 的初始数据指针数组,在不使用全局解释器锁(GIL)的情况下
    char** NpyIter_GetInitialDataPtrArray(NpyIter* it) nogil
    
    # 获取迭代器 `it` 的索引指针数组
    npy_intp* NpyIter_GetIndexPtr(NpyIter* it)
    
    # 获取迭代器 `it` 内部循环的步幅数组,在不使用全局解释器锁(GIL)的情况下
    npy_intp* NpyIter_GetInnerStrideArray(NpyIter* it) nogil
    
    # 获取迭代器 `it` 内部循环的大小指针,在不使用全局解释器锁(GIL)的情况下
    npy_intp* NpyIter_GetInnerLoopSizePtr(NpyIter* it) nogil
    
    # 将迭代器 `it` 内部固定步幅的数组复制到 `outstrides` 数组中,在不使用全局解释器锁(GIL)的情况下
    void NpyIter_GetInnerFixedStrideArray(NpyIter* it, npy_intp* outstrides) nogil
    
    # 检查迭代器 `it` 的当前迭代是否需要使用 Python/C API,返回布尔值,在不使用全局解释器锁(GIL)的情况下
    npy_bool NpyIter_IterationNeedsAPI(NpyIter* it) nogil
    
    # 调试函数:打印迭代器 `it` 的调试信息
    void NpyIter_DebugPrint(NpyIter* it)