预期类型';联合[ndarray,Iterable]';Python指令中的警告

预期类型';联合[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

我已经将一个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[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)