首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算numpy.radians和浮动/数组输入元素的类型提示

计算numpy.radians和浮动/数组输入元素的类型提示
EN

Stack Overflow用户
提问于 2021-12-09 15:48:57
回答 3查看 260关注 0票数 3

我有一个功能如下:

代码语言:javascript
复制
import numpy as np

def test() -> None:
    a = map(np.radians, (1.,2.,np.array([1,2,3])))

使用mypy计算此值将返回错误消息。

代码语言:javascript
复制
error: Argument 1 to "map" has incompatible type "ufunc"; expected "Callable[[object], Any]"

只使用浮点数或只使用数组作为map的输入列表在这里没有问题,当输入列表/元组包含这两种类型的对象时,就会出现问题。在运行时,这也没有问题。如何修改此函数以满足mypy的要求并使其成为文件类型?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-18 17:39:24

这里的问题是,mypy推断(1., 2., np.array([1,2,3]))的元素类型为object (而不是您在这里希望的Union[float, np.ndarray] ),这与np.radians不兼容。

作为一种解决方法,您可以为tuple/list提供一个与tuple/list和np.radians的参数兼容的显式类型。例如:

代码语言:javascript
复制
from typing import Sequence, Union
import numpy as np

def test() -> None:
    x: Sequence[Union[float, np.ndarray]] = (1., 2., np.array([1,2,3]))
    a = map(np.radians, x)

有一个开放的类型的github问题似乎类似,但可能不是完全相同的:python/mypy#6697

票数 2
EN

Stack Overflow用户

发布于 2021-12-16 22:17:01

恕我直言,正确的解决方案是告诉MyPy忽略这一行。

代码语言:javascript
复制
import numpy as np

def test() -> None:
    a = map(np.radians, (1.,2.,np.array([1.,2.,3.]))) # type: ignore

PS:您总是有一个非常不可取的选项来编辑numpy库并修复_UFunc_Nin1_Nout1的调用签名以接受对象类型(除了ArrayLike)。下面的编辑会使您的类型错误信息消失。

代码语言:javascript
复制
--- a/typing/_ufunc.pyi
+++ b/typing/_ufunc.pyi
@@ -86,21 +86,21 @@ class _UFunc_Nin1_Nout1(ufunc, Generic[_NameType, _NTypes, _IDType]):
         casting: _Casting = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
         signature: Union[str, _2Tuple[Optional[str]]] = ...,
         extobj: List[Any] = ...,
     ) -> Any: ...
     @overload
     def __call__(
         self,
-        __x1: ArrayLike,
+        __x1: ArrayLike | object,
         out: Union[None, NDArray[Any], Tuple[NDArray[Any]]] = ...,
         *,
         where: Optional[_ArrayLikeBool_co] = ...,
         casting: _Casting = ...,
         order: _OrderKACF = ...,
         dtype: DTypeLike = ...,
         subok: bool = ...,
         signature: Union[str, _2Tuple[Optional[str]]] = ...,
         extobj: List[Any] = ...,
     ) -> NDArray[Any] | Any: ...

参考资料

票数 0
EN

Stack Overflow用户

发布于 2021-12-20 16:23:26

我不知道这是不是故意的,但你没有在数组中使用点。

代码语言:javascript
复制
import numpy as np

def test() -> None:
    a = map(np.radians, (1.,2.,np.array([1.,2.,3.])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70292790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档