有人是否实现了针对特定的numpy.ndarray
类的类型提示?
目前,我正在使用typing.Any
,但更具体的内容会更好。
例如,如果NumPy团队为其array_like对象类别添加类型别名,那就更好了。更好的做法是,在dtype级别实现支持,以便支持其他对象以及ufunc。
有人是否实现了针对特定的numpy.ndarray
类的类型提示?
目前,我正在使用typing.Any
,但更具体的内容会更好。
例如,如果NumPy团队为其array_like对象类别添加类型别名,那就更好了。更好的做法是,在dtype级别实现支持,以便支持其他对象以及ufunc。
numpy.typing
模块,其中包含一个NDArray
通用类型。
截至2022-09-05,支持形状仍在numpy/numpy#16544中进行。
numpy.typing.NDArray = numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]]
A generic version of
np.ndarray[Any, np.dtype[+ScalarType]]
.Can be used during runtime for typing arrays with a given dtype and unspecified shape.
Examples:
>>> 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)
NDarray
的定义,似乎(1)在运行时有区别(因为NDArray
是一个通用别名,而ndarray
是一个类),以及(2)在类型检查时(例如使用mypy、pyright等),NDarray[Foo]
和np.ndarray[Any,np.dtype[Foo]]
之间应该没有区别。 - Jashanp.ndarray[...]
类型提示的第一个参数是什么,为什么所有示例中它都是Any
? - JoooeeyAny
,因为 numpy 尚未实现对此类注释的支持。 - Jasha检查最新版NumPy是否有一个新的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的错误和提交可以在这里跟踪:
添加功能的通常方式是fork主要代码库,开发功能直到它足够稳定,然后提交拉取请求。显然,在这个过程的不同阶段,您需要其他开发人员的反馈。如果您无法自己进行开发,则必须说服其他人这是一个有价值的项目。
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
传递其参数(像许多函数一样),这样的注释将不完整,因为输入可能是一个 list
或 np.matrix
等。
评估此问题和答案时,请注意日期。当时 484 是一个相对较新的 PEP,用于标准 Python 的代码仍在开发中。但看起来提供的链接仍然有效。
annotations
?据我所知,在简单的 Python 3 中,一个函数会得到一个 __annotations__
字典,但解释器不做任何处理。 - hpauljtyping
注解添加到现有的 numpy
函数(包括 np.array
)中,还是只需要简单地在自己的函数中添加注解就能让类型更加容易? - hpaulj return np_arr.ndim == 1
def Matrix(np_arr):
return np_arr.ndim > 1
```希望能对某些人有所帮助。
- Vitalis在我的公司,我们一直使用:
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 满意(即你仍然会得到令人讨厌的警告线):
Array['2,2',int]
比NDArray[Shape["2, 2"], Int]
更容易输入,并且您可以通过命名维度来赋予意义,例如BGRImageArray = Array['H,W,3', 'uint8']
清楚地表明第一个维度是高度。尽管如此,如果您确实打算使用mypy进行类型检查,请一定选择nptyping
。 - Peternptyping 增加了许多灵活性,用于指定numpy类型提示。
我所做的就是将其定义为
Dict[Tuple[int, int], TYPE]
例如,如果您想要一个浮点数数组,可以这样做:
a = numpy.empty(shape=[2, 2], dtype=float) # type: Dict[Tuple[int, int], float]
从文档的角度来看,这当然不是完全准确的,但对于分析正确用法并在pyCharm中获得正确的完成效果非常有效!
np.ndarray
类型,这更糟糕。 - Jules G.M.
argparse
解析器。对于Py2,它使用装饰器来创建一个类似的annotation
数据库。 - hpauljtyping
是 Py 3.5 中的新功能。许多numpy
用户仍在使用 Py2。我在我的系统上有 3.5,但我没有为其安装numpy
。numpy
开发人员不会为 Python 的前沿添加功能(除了@
运算符)。 - hpauljnumpy
维护在github
存储库上。查看issues
和pull requests
;注册并提交您自己的问题。可能有另一个讨论开发问题的论坛,但我大多数情况下会查看github
的问题。 - hpaulj