预期类型';联合[ndarray,Iterable]';Python指令中的警告
我已经将一个Matlab函数转换为Python语言,该函数用于创建一个过完备的离散余弦变换矩阵,以表示向量空间中的一维信号 Matlab函数 Python翻译函数 我使用PyCharm作为Python IDE,这个软件在for循环内的指令预期类型';联合[ndarray,Iterable]';Python指令中的警告,python,numpy,pycharm,warnings,translate,Python,Numpy,Pycharm,Warnings,Translate,我已经将一个Matlab函数转换为Python语言,该函数用于创建一个过完备的离散余弦变换矩阵,以表示向量空间中的一维信号 Matlab函数 Python翻译函数 我使用PyCharm作为Python IDE,这个软件在for循环内的指令v=np.transpose(np.cos(np.arange(0,n)*np.pi*k*l))中提出了一个我不理解的警告,特别是针对np.transpose函数的参数,np.cos(np.arange(0,n)*np.pi*k*l) 应为类型“Union[nd
v=np.transpose(np.cos(np.arange(0,n)*np.pi*k*l))
中提出了一个我不理解的警告,特别是针对np.transpose
函数的参数,np.cos(np.arange(0,n)*np.pi*k*l)
应为类型“Union[ndarray,Iterable]”,但得到的是“int”而不是更少
此检查检测函数调用表达式中的类型错误。应得的
对于动态分派和duck类型,这在有限但复杂的环境中是可能的
有用的案例数量。可以指定函数参数的类型
在DocString或Python 3函数注释中
你能给我解释一下这个警告吗?如何纠正呢?写这种指令的正确方法是什么?我猜PyCharm并不完全理解numpy。它的外观和行为类似于有效的Python: 使用我的IDE,
Ipython
,我可以:
In [84]: n,k,l=3, .4, 1
In [85]: v = np.transpose(np.cos(np.arange(0, n) * np.pi * k * l))
In [86]: v
Out[86]: array([ 1. , 0.30901699, -0.80901699])
PyCharm中的numpy代码经常出现这些误报。在某种意义上,他们说: 几乎所有以相当优雅的numpy风格编写的代码都会淹没在警告消息中 对于您自己函数的参数,您可以。对于很多numpy代码来说,这并不重要。我发现有两种解决方案:
#noinspection PyTypeChecker
抑制每行或每函数的警告。有关抑制警告的详细信息,请参阅在buzjwa的回答后面附加: 选项3:使用mypy进行类型检查,并手动添加为numpy创建的第三方存根文件
您需要将此存根文件添加到内部python typeshed中。让我们知道你进展如何 可以将该表达式扩展为多个步骤,以便查看哪个步骤失败吗?
import numpy as np
def odct1dict(n, l):
"""
1-D Overcomplete DCT dictionary.
D = odct1dict(N, L) returns the overcomplete DCT dictionary of size NxL
for signals of length N.
:param n: signal size
:type n: int
:param l: number of atoms
:type l: int
:return: 1-D Overcomplete DCT dictionary NumPy array
"""
d = np.zeros((n, l))
d[:, 0] = 1 / np.sqrt(n)
for k in range(1, l):
v = np.transpose(np.cos(np.arange(0, n) * np.pi * k * l))
v = v - np.mean(v)
d[:, k] = v / np.linalg.norm(v)
return d
In [84]: n,k,l=3, .4, 1
In [85]: v = np.transpose(np.cos(np.arange(0, n) * np.pi * k * l))
In [86]: v
Out[86]: array([ 1. , 0.30901699, -0.80901699])
transpose_arg = np.cos(np.arange(0, n) * np.pi * k * l) # type: np.ndarray
v = np.transpose(transpose_arg)