127

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

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

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

4

6 回答 6

46

更新

检查新typing模块的最新 numpy 版本

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代码。


您在文档中引用了该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(正如许多人所做的那样),那么这样的注释将是不完整的,因为您的输入可能是 alistnp.matrix等。


在评估此问答时,请注意日期。484 在当时是一个相对较新的 PEP,将其用于标准 Python 的代码仍在开发中。但看起来提供的链接仍然有效。

于 2016-02-28T20:45:00.530 回答
20

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


来自Numpy 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)

截至 2021 年 11 月 10 日,每个numpy/numpy#16544对形状的支持仍在进行中。

于 2021-06-25T13:44:36.253 回答
17

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

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 检查器来检查形状是否有效(我们应该在某个时候发布)。唯一的问题是它不会让 PyC​​harm 高兴(即你仍然会收到讨厌的警告行):

在此处输入图像描述

于 2020-09-23T16:44:00.693 回答
5

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

于 2016-02-27T23:28:49.390 回答
5

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

于 2020-09-16T17:40:52.790 回答
-1

我所做的只是将其定义为

字典[元组[int, int], TYPE]

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

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

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

于 2016-10-18T19:39:52.053 回答