有没有人为特定numpy.ndarray
类实现类型提示?
现在,我正在使用typing.Any
,但如果有更具体的东西会很好。
例如,如果 NumPy 人为他们的array_like对象类添加了类型别名。更好的是,在dtype级别实现支持,以便支持其他对象以及ufunc。
有没有人为特定numpy.ndarray
类实现类型提示?
现在,我正在使用typing.Any
,但如果有更具体的东西会很好。
例如,如果 NumPy 人为他们的array_like对象类添加了类型别名。更好的是,在dtype级别实现支持,以便支持其他对象以及ufunc。
检查新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 错误和提交可以在
添加功能的通常方法是分叉主存储库,开发该功能直到它是防弹的,然后提交一个拉取请求。显然,在流程的各个阶段,您都需要其他开发人员的反馈。如果您不能自己进行开发,那么您必须说服其他人这是一个有价值的项目。
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
(正如许多人所做的那样),那么这样的注释将是不完整的,因为您的输入可能是 alist
或np.matrix
等。
在评估此问答时,请注意日期。484 在当时是一个相对较新的 PEP,将其用于标准 Python 的代码仍在开发中。但看起来提供的链接仍然有效。
Numpy 1.21 包含一个numpy.typing
具有NDArray
泛型类型的模块。
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对形状的支持仍在进行中。
在我的公司,我们一直在使用:
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 高兴(即你仍然会收到讨厌的警告行):
查看数据形状。它使用数据类型以及一些语法来确定输入和输出数组的大小。
nptyping为指定 numpy 类型提示增加了很多灵活性。
我所做的只是将其定义为
字典[元组[int, int], TYPE]
因此,例如,如果你想要一个浮点数组,你可以这样做:
a = numpy.empty(shape=[2, 2], dtype=float) # type: Dict[Tuple[int, int], float]
从文档的角度来看,这当然不准确,但是对于分析正确的用法并使用 pyCharm 正确完成它非常有用!