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

时间:2016-02-27 18:44:56

标签: numpy multidimensional-array python-3.5 strong-typing type-hinting

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

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

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

6 个答案:

答案 0 :(得分:18)

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

enter image description here

答案 4 :(得分:0)

Numpy 1.21 包括对类型提示的一些支持。具体来说,numpy.typing 模块公开了一个 NDArray 泛型类型。

以下描述和示例直接取自Numpy 1.21 docs
`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类型提示增加了很多灵活性。