键入numpy.ndarray的提示/注释(PEP 484)


79

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

现在,我正在使用typing.Any,但是最好有更具体的内容。

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


1
pypi.python.org/pypi/plac可以利用Py3批注-填充argparse解析器。对于Py2,它使用装饰器来创建类似的annocation数据库。
hpaulj

1
typing是Py 3.5的新功能。许多numpy用户仍在使用Py2。我的系统上有3.5,但尚未numpy安装。 numpy开发人员不会为Python的最先进功能(@运算符除外)添加功能
hpaulj

1
numpygithub存储库上维护。看issuespull requests; 注册并提交您自己的问题。可能会有另一个论坛来讨论开发问题,但我大多数都关注这些github问题。
hpaulj

6
对于任何人寻找到这个问题-它看起来像在这里有一个相关的解决方案:stackoverflow.com/questions/52839427/...
伊塔马尔Mushkin

1
>现在有... @贾莎,这张票是由我,OP于4.5年前打开的。
INON

Answers:


27

看起来typing模块是在以下位置开发的:

https://github.com/python/typing

numpy存储库位于

https://github.com/numpy/numpy

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

http://bugs.python.org/

添加功能的通常方法是派生主存储库,开发功能直至防炸弹,然后提交拉取请求。显然,在此过程的各个阶段,您都需要其他开发人员的反馈。如果您不能自己进行开发,则必须说服其他人,这是一个有价值的项目。

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
您使用的是什么软件,编辑器或解释器annotations?据我所知,在普通的Python 3中,一个函数获取一个__annotations__字典,但是解释器对此不执行任何操作。
hpaulj

1
您是要向typing现有numpy功能(包括np.array)中添加注释,还是只是将注释添加到自己的函数中的类型?
hpaulj

3
我已经将此答案标记为可接受的答案,但是为了完整起见,我打算使用后者(在我自己的代码中使用Numpy进行类型提示)。我全都是Duck Typing的人,但是当您可以提供静态类型信息时,我不明白为什么不这样做,仅是为了静态代码分析(PyCharm会警告不兼容的类型)。谢谢,@ hpaulj!
2016年

由于键入模块仅提供提示,因此我仅为了可读性而创建了两个帮助程序标签,并注意它没有通过mypy静态类型检查。 def Vector(np_arr): return np_arr.ndim == 1 def Matrix(np_arr): return np_arr.ndim > 1 。希望对别人有所帮助。
Vitalis

形状呢?我可以添加一些提示,例如def blah()-> np.ndarray(785):但是我不能添加第二个维度,例如-> np.ndarray(785,10)。具有形状提示非常有帮助,并且可以使我的代码中的多个函数清晰化,这些函数可以生成维数不同的数组。
Steve3p0

5

DataShape。它使用数据类型以及一些语法来确定输入和输出数组的大小。


那么DataShape是Numpy的替代品吗?不完全是我的想法,因为我正在使用SciPy,它明确需要Numpy。
2016年

1
DataShape是一种描述。当前没有正式的函数注释,但是到目前为止,如果要构建函数注释,这是我对Numpy类型的最佳描述。是的,在将函数注释引入numpy源之前,我建议创建一个新的模块名称并将其用作概念证明。
Back2Basics '16

2
如何使用DataShape?该文档说了很多有关DataShape可以做什么的内容,但是我没有真正找到任何具体的示例说明如何将它用于Python中的类型提示。
papercrane

1
这只是一个仅链接的答案。最好在此处添加此库的使用示例,并提供链接以供参考。
乔治

1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。-评分
谢尔盖·舒宾

4

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

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开心(即,您仍然会收到讨厌的警告行):

在此处输入图片说明


2

我所做的就是将其定义为

Dict [Tuple [int,int],TYPE]

因此,例如,如果您想要一个浮点数数组,则可以执行以下操作:

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

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


14
这比np.ndarray用作类型更糟糕
Jules GM

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.