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

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

现在,我正在使用 typing.Any,但是如果有更具体的东西就好了。

例如,如果 NumPy 人员为他们的 类似 array _ like对象类添加了一个 类型化名。更好的是,在 Dtype级实现支持,以便支持其他对象以及 Ufunc

95079 次浏览

更新

检查最新的数字版本的一个新的 typing模块

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

过时的回答

看起来 typing模块是在以下地方开发的:

Https://github.com/python/typing

numpy存储库位于

Https://github.com/numpy/numpy

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

Http://bugs.python.org/

通常添加特性的方法是分叉主存储库,开发特性直到它是防爆的,然后提交一个拉请求。显然,在过程的不同阶段,您需要其他开发人员的反馈。如果你不能自己开发,那么你必须说服别人这是一个有价值的项目。

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


您在 numpy文档中引用了 array-like段,请注意其 typing信息:

一个简单的方法来确定是否可以使用 array ()将对象转换成一个麻木的数组,只需交互式地尝试一下,看看它是否有效!(巨蟒之路)。

换句话说,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 的代码仍在开发中。但是看起来提供的链接仍然有效。

我只是把它定义为

Dict [ Tuple [ int,int ] ,TYPE ]

例如,如果你想要一个浮点数组,你可以这样做:

a = numpy.empty(shape=[2, 2], dtype=float) # type: Dict[Tuple[int, int], float]

从文档的角度来看,这当然不是精确的,但是对于分析正确的用法和使用 pyCharm 获得正确的完成,它工作得非常好!

Nptype 为指定 numpy 类型提示增加了许多灵活性。

在我的公司,我们一直在使用:

from typing import TypeVar, Generic, Tuple, Union, Optional
import numpy as np


Shape = TypeVar("Shape")
DType = TypeVar("DType")


class Array(np.ndarray, Generic[Shape, DType]):
"""
Use this to type-annotate numpy arrays, e.g.
image: Array['H,W,3', np.uint8]
xy_points: Array['N,2', float]
nd_mask: Array['...', bool]
"""
pass


def compute_l2_norm(arr: Array['N,2', float]) -> Array['N', float]:
return (arr**2).sum(axis=1)**.5


print(compute_l2_norm(arr = np.array([(1, 2), (3, 1.5), (0, 5.5)])))


我们实际上有一个 MyPy 检查器来检查形状是否正确(我们应该在某个时候发布这个检查器)。唯一的问题是,它并不能让 PyCharm 高兴(即你仍然会收到讨厌的警告信号) :

enter image description here

Numpy 1.21包含一个具有 NDArray泛型类型的 numpy.typing模块。


来自 愚蠢的1.21文件:
numpy.typing.NDArray = numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]

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

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

例子:

>>> 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-09-05年,对形状的支持仍然是每个 Numpy/numpy # 16544进行中的工作。