Python和numpy定义的数组:使用类型检查

2024-09-30 01:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想已经有人问过了,但我找不到

Python 6.6如何检查非内置类型?在

例如,假设我想要一个foo()函数,它以numpy数组作为参数,并返回类Bah的一个实例

def foo(a: np.array) -> Bah

我能做这样的事吗?如何将这些类型添加到检查中?在


Tags: 实例函数numpy类型参数foodefnp
3条回答

您可以使用键入。它是一个Python库https://docs.python.org/3/library/typing.html

import numpy as np
from bar import Bah
from typing import Type

def foo(a: np.ndarray): -> Type[Bah]
    return a.T  #example

如果类型的名称在范围内(例如,您在当前文件中定义了Bob,或者执行了from stuff importBob`),您可以指定任何您想要的内容作为类型注释。在

一般来说,类型检查器不需要任何类型的特殊知识就可以知道某个值是否是该类型。如果它看到您将此函数的结果存储在一个类型为Bob的变量或{}的超类型(其中包括object和{},还包括未注记的变量),那么这是合法的;如果它看到您将它存储在类型为int的变量或其他不相关的类型中,则不合法。类似地,如果将结果传递给某个参数为Bob或{}或未注释的其他函数,或者将其附加到List[Bob]

但是np.array是另一个问题。这实际上不是一个类型,它只是一个构造函数函数,通常返回一个np.ndarray类型的值,这是一个你通常不会想到的类型。因此,如果没有某种特殊信息,array应该被视为ndarray的同义词,那么类型检查器就无法处理这个问题。在

另外,许多NumPy函数和您自己编写的函数实际上都采用“类似数组”的形式,它可以是ndarray,或者通常是matrix,但通常也可以是任何序列。在这种情况下,您可能真的想用更精确的注释,比如typing.Sequence-或者使用自定义的ArrayLike类型进行注释。在

当我们在这里的时候,你经常想要指定你的函数不需要数组的数据类型,它需要一个float数组,或者它需要一个<something>的数组,并且想要返回一个值相同的Bob。因此,您可能希望将Sequence[float]或{}之类的泛型类型转换为某个typevar T。在

您甚至可能需要一定数量的维度,甚至需要这些维度的一个形状,甚至需要一个部分形状,或者甚至要求参数x和{}必须一起广播或可多次广播。您可以将这些信息推送到泛型类型中,但必须仔细考虑。在

不管怎样,对于你自己的类型,你很少需要思考那么深。要么Bob是一个只需要标准继承规则的简单类型,所以您不必做任何事情,要么它是一个泛型集合类型,您只需要将其继承/注册为MutableSequenceMapping或其他类型,它会自动获得适当的泛型规则,或者是一个特定的集合类型,您只需继承/注册为Set[int],它会自动获得适当的规则。在

基本上,如果知道a是一个numpy数组,只需看看(a)类型的输出。这会告诉你这个班叫做努比·恩达雷". 然后使用isinstance()进行检查。像这样:

import numpy #if you import numpy as np, you need to check for np.ndarray instead

def foo(a):
    if isinstance(a,numpy.ndarray):
        return Blah()
    else:
        print('a needs to be of type numpy.ndarray')
        return

相关问题 更多 >

    热门问题