使用numpy阵列类型提示做更多的事情:注释和验证形状&dtype

通过完整的通用规范改进静态分析和运行时验证该帖子使用numpy阵列类型提示进行更多:注释和验证形状和DTYPE首先出现在数据科学上。

来源:走向数据科学

数组对象可以采用许多具体表单。它可能是一个布尔值的一维(1D)阵列,或者是8位未签名整数的三维(3D)阵列。正如内置函数isInstance()所示,每个数组都是np.ndarray的实例,无论形状或存储在数组中的元素类型,即dtype。同样,许多类型通知的接口仍然只指定NP.NDARRAY:

isInstance() np.ndarray dtype
导入numpy作为npdef进程(x:np.ndarray,y:np.ndarray,) - > np.ndarray:...

这种类型的注释不足:大多数接口对传递数组的形状或dtype都有很高的期望。如果通过3D阵列,则大多数代码将失败,或者在预期的浮子数组中传递一数组的日期。

现在可以完全指定通用np.ndarray,数组形状和dtype特征的充分优势:

def过程(x:x:np.ndarray [tuple [int],np.dtype [np.bool_]],y:np.ndarray [tuple [tuple [int,int,int],np.dtype [np.uint8]]

有了这样的详细信息,最近的静态分析工具(例如Mypy和Pyright)甚至在运行代码之前就可以找到问题。此外,运行时验证器专门用于Numpy,例如staticframe的SF.CallGuard,可以重新使用相同的注释来进行运行时验证。

mypy Pyright staticframe sf.callguard

Python中的通用类型

通用内置容器(例如列表和dict)可以通过指定每个接口的类型来使其具体。一个函数可以声明其列出列表的列表[str];或者可以用dict [str,bool]指定str的dict of str。

列表 dict str 列表[str] bool dict [str,bool]

通用np.ndarray

元组 np.dtype

形状类型参数

np.empty np.full (10,) (10,100,1000) 元组[int] 元组[int,int,int] 元组[int,...] 字面

dtype类型参数

np.datetime64 np.uint8 np.float64 np.bool_ np.integer np.inexact np.number

制作np.ndarray混凝土

一维阵列的布尔值:

CallGuard 检查 警告