目前,我正试图更多地使用numpy类型来使我的代码更清晰,但不知何故,我已经达到了目前无法覆盖的限制。
是否可以指定特定的形状和相应的数据类型?范例:
Shape=(4,)
datatype= np.int32
到目前为止,我的尝试看起来像下面这样(但都只是抛出错误):
第一次尝试:
import numpy as np
def foo(x: np.ndarray[(4,), np.dtype[np.int32]]):
...
result -> 'numpy._DTypeMeta' object is not subscriptable
第二次尝试:
import numpy as np
import numpy.typing as npt
def foo(x: npt.NDArray[(4,), np.int32]):
...
result -> Too many arguments for numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]]
另外,不幸的是,我在文档中找不到任何关于它的信息,或者当我按照文档中的方式实现它时,我只会得到错误。
2条答案
按热度按时间bvjxkvbb1#
目前,
numpy.typing.NDArray
只接受dtype,如下所示:numpy.typing.NDArray[numpy.int32]
.不过你有一些选择。使用
typing.Annotated
typing.Annotated
允许您为类型创建别名,并将一些额外的信息与之绑定。在一些
my_types.py
中,你可以写出你想要暗示的形状的所有变化:然后在
foo.py
中,你可以提供一个numpy dtype并将它们用作typehint:MyPy将识别
arr
为np.ndarray
,并将其检查为np.ndarray
。形状检查只能在运行时完成,如本例中的assert
。如果你不喜欢这个Assert,你可以用你的创造力来定义一个函数来为你做检查。
使用
nptyping
另一个选择是使用第三方库
nptyping
(是的,我是作者)。你会放弃
my_types.py
,因为它不再有用了。你的
foo.py
会变成这样:使用
beartype
+typing.Annotated
还有另一个名为
beartype
的第三方库,您可以使用。它可以采用typing.Annotated
方法的变体,并将为您执行运行时检查。您将恢复您的
my_types.py
,内容类似于:你的
foo.py
会变成:使用
beartype
+nptyping
你也可以把这两个库叠加起来。
您的
my_types.py
可以再次删除,您的foo.py
将变成如下所示:cbjzeqam2#
我习惯这样做:
如果你有特定的问题与形状,你应该重塑之前,这取决于输入形状,你希望有。如果您需要帮助来正确地重塑输入
x
,请提供输入x
的示例。