是否有人为特定的numpy.ndarray类实施了类型提示?
现在,我正在使用typing.Any,但如果有更具体的内容会更好。
例如,如果numpy人为他们的type alias对象类添加了array_like。更好的是,在dtype级别实施支持,以便支持其他对象,以及ufunc。
答案 0 :(得分:18)
看起来typing
模块的开发位置为:
https://github.com/python/typing
主numpy
存储库位于
https://github.com/numpy/numpy
可以在
跟踪Python错误和提交添加功能的常用方法是分叉主存储库,开发功能直到它是防弹的,然后提交拉取请求。显然,在流程的各个阶段,您需要其他开发人员的反馈。如果你不能自己进行开发,那么你必须让别人相信这是一个有价值的项目。
cython
有一种注释形式,用于生成有效的C
代码。
您在array-like
文档中引用了numpy
段落。请注意其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的代码。但看起来提供的链接仍然有效。
答案 1 :(得分:4)
结帐DataShape。它使用数据类型以及输入和输出数组应该有多大的语法。
答案 2 :(得分:4)
我所做的只是将其定义为
Dict [Tuple [int,int],TYPE]
例如,如果你想要一个浮点数组,你可以这样做:
a = numpy.empty(shape=[2, 2], dtype=float) # type: Dict[Tuple[int, int], float]
从文档的角度来看,这当然不是确切的,但是为了分析正确的用法并使用pyCharm正确完成,它的效果非常好!
答案 3 :(得分:3)
在我公司,我们一直在使用:
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.
def transform_image(image: Array['H,W,3', np.uint8], ...):
...
"""
pass
def func(arr: Array['N,2', int]):
return arr*2
print(func(arr = np.array([(1, 2), (3, 4)])))
我们实际上有一个MyPy检查器,用于检查形状是否正常(应该在某个时候释放)。唯一的事情是它不能使PyCharm开心(即,您仍然会收到讨厌的警告行):
答案 4 :(得分:0)
Numpy 1.21 包括对类型提示的一些支持。具体来说,numpy.typing
模块公开了一个 NDArray
泛型类型。
`numpy.typing.mypy_plugin.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.
New in version 1.21.
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)
答案 5 :(得分:-1)
nptyping为指定numpy类型提示增加了很多灵活性。