Python numpy.ndarray的类型提示/注释(PEP 484)

Python numpy.ndarray的类型提示/注释(PEP 484),python,numpy,python-3.5,type-hinting,Python,Numpy,Python 3.5,Type Hinting,是否有人为特定类实现了类型暗示 现在,我正在使用,但如果有更具体的东西就好了 例如,如果NumPy人为他们的对象类添加了一个。更好的是,在级别上实现支持,以便支持其他对象,以及。签出。它使用数据类型以及一些语法来确定输入和输出数组的大小。Update 检查最新的numpy版本以获取新的键入模块 过时的答复 似乎打字模块是在以下位置开发的: 主numpy存储库位于 Python bug和提交可以在以下位置进行跟踪: 添加特性的通常方法是分叉主存储库,开发特性,直到它是防爆炸的,然后提交拉请

是否有人为特定类实现了类型暗示

现在,我正在使用,但如果有更具体的东西就好了

例如,如果NumPy人为他们的对象类添加了一个。更好的是,在级别上实现支持,以便支持其他对象,以及。

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

Update 检查最新的numpy版本以获取新的
键入模块

过时的答复 似乎
打字
模块是在以下位置开发的:

numpy
存储库位于

Python bug和提交可以在以下位置进行跟踪:

添加特性的通常方法是分叉主存储库,开发特性,直到它是防爆炸的,然后提交拉请求。显然,在过程中的不同阶段,您需要其他开发人员的反馈。如果你不能自己开发,那么你必须说服别人这是一个有价值的项目

cython
有一种注释形式,用于生成高效的
C
代码


您在
numpy
文档中引用了类似
数组的
段落。注意它的
键入
信息:

要确定是否可以使用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)
工作。当然,如果您的函数最终调用了某个
numpy
函数,该函数通过
asanyarray
传递其参数(正如许多函数一样),这样的注释将是不完整的,因为您的输入可能是
列表
,或
np.matrix
,等等



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

我只是将其定义为

Dict[Tuple[int,int],TYPE]

例如,如果您想要一个浮点数组,可以执行以下操作:

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


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

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

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

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高兴(即你仍然会收到令人讨厌的警告线):


可以使用Py3注释-填充
argparse
解析器。对于Py2,它使用装饰器创建类似的
注释
数据库。
键入
是Py3.5的新功能。许多
numpy
用户仍然使用Py2。我的系统上有3.5,但我没有为它安装
numpy
numpy
开发人员不打算为Python的尖端添加功能(除了
@
操作符)
numpy
github
存储库中维护。查看
问题
拉取请求
;注册并提交您自己的问题。可能还有另一个讨论开发问题的论坛,但我主要关注的是
github
问题。对于任何关注这个问题的人来说,这里似乎有一个相关的解决方案:>现在有了@Jasha这张票是我在4.5年前打开的。那么DataShape是一个Numpy替代品?不完全是我所想的,因为我使用的是SciPy,它需要Numpy,显式地。DataShape是一个描述。目前还没有正式的函数注释,但到目前为止,如果您打算在函数注释中构建,这是我见过的关于Numpy类型的最佳描述。是的,我建议在将函数注释引入numpy源代码之前创建一个新的模块名并将其用作概念证明?文档中说了很多关于DataShape可以做什么的内容,但我并没有找到任何具体的例子来说明如何在Python中使用DataShape进行类型暗示。这只是一个只提供链接的答案。在此处添加此库的使用示例,并提供链接以供参考。虽然此链接可以回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-您使用的是哪种软件、编辑器或解释器使用了
注释
?据我所知,在普通Python 3中,函数会得到一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,或者只是类型,这样可以更容易地为自己的函数添加注释?我已经将此答案标记为已接受的答案,但为了完整起见,我选择了后者(在我自己的代码中使用Numpy的类型提示)。我完全支持Duck类型,但是当您可以提供静态类型信息时,我不明白您为什么不这样做,即使只是为了静态代码分析(PyCharm确实警告不兼容的类型)。谢谢,@hpaulj!由于输入模块只是提供提示,所以我创建了两个助手标签纯粹是为了可读性,并注意它没有通过mypy静态类型检查<代码>定义向量(np_arr):返回np_arr.ndim==1定义矩阵(np_arr):返回np_arr.ndim>1<
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)])))