numpy.ndarray 的类型提示/注释(PEP 484)

新手上路,请多包涵

有没有人为特定的 numpy.ndarray 类实现了类型提示?

现在,我正在使用 typing.Any ,但最好能有更具体的东西。

例如,如果 NumPy 的人为他们的 array_like 对象类添加了一个 类型别名。更好的是,在 dtype 级别实现支持,以便支持其他对象以及 ufunc

原文由 Inon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

更新

检查最近的 numpy 版本是否有新的 typing 模块

https://numpy.org/doc/stable/reference/typing.html#module-numpy.typing

过时的答案

看起来 typing 模块开发于:

https://github.com/python/打字

主要的 numpy 存储库位于

https://github.com/numpy/numpy

可以在以下位置跟踪 Python 错误和提交

http://bugs.python.org/

添加功能的通常方法是分叉主存储库,开发功能直到它是 bomb proof,然后提交 pull request。显然,在流程的不同阶段,您需要其他开发人员的反馈。如果您不能自己进行开发,那么您必须说服其他人这是一个有价值的项目。

cython 有一种注释形式,它用于生成高效的 C 代码。


您在 numpy 文档中引用了 array-like 段落。注意它的 typing 信息:

找出对象是否可以使用 array() 转换为 numpy 数组的一种简单方法是简单地以交互方式尝试它,看看它是否有效! (Python 方式)。

换句话说 numpy 开发人员拒绝被固定。他们没有或不能用文字描述哪些对象可以或不能转换为 np.ndarray

 In [586]: np.array({'test':1})   # a dictionary
Out[586]: array({'test': 1}, dtype=object)

In [587]: np.array(['one','two'])  # a list
Out[587]:
array(['one', 'two'],
      dtype='<U3')

In [589]: np.array({'one','two'})  # a set
Out[589]: array({'one', 'two'}, dtype=object)

对于您自己的功能,注释如下

def foo(x: np.ndarray) -> np.ndarray:

作品。当然,如果您的函数最终调用了一些 numpy 函数,该函数将其参数传递给 asanyarray (正如许多人所做的那样),这样的注释将是不完整的,因为您的输入可能是 listnp.matrix


评估此问答时,请注意日期。 484 在当时是一个相对较新的 PEP,将它用于标准 Python 的代码仍在开发中。但看起来提供的链接仍然有效。

原文由 hpaulj 发布,翻译遵循 CC BY-SA 4.0 许可协议

Numpy 1.21 包括一个 numpy.typing 模块和一个 NDArray 通用类型。


来自 Numpy 1.21 文档
 numpy.typing.NDArray = numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]

np.ndarray[Any, np.dtype[+ScalarType]] 的通用版本。

可以在运行时用于键入具有给定数据类型和未指定形状的数组。

例子:

 >>> import numpy as np
>>> import numpy.typing as npt

>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]]

>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]

>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)

>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
...     return np.array(a)

截至 2022 年 9 月 5 日,根据 numpy/numpy#16544 ,对形状的支持仍在进行中。

原文由 Jasha 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题