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

osj*_*ick 5 python warnings numpy translate pycharm

我已经翻译了一个Matlab函数来创建一个Overcomplete Discrete Cosine Transform矩阵来表示这种矢量空间中的1D信号到Python语言.

Matlab函数

function D = odctdict(n,L)
%ODCTDICT Overcomplete DCT dictionary.
%  D = ODCTDICT(N,L) returns the overcomplete DCT dictionary of size NxL
%  for signals of length N.
%
%  See also ODCT2DICT, ODCT3DICT, ODCTNDICT.    

D = zeros(n,L);
D(:,1) = 1/sqrt(n);
for k = 2:L
  v = cos((0:n-1)*pi*(k-1)/L)';
  v = v-mean(v);
  D(:,k) = v/norm(v);
end
Run Code Online (Sandbox Code Playgroud)

Python翻译功能

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
Run Code Online (Sandbox Code Playgroud)

我正在使用PyCharm作为Python IDE,这个软件v = np.transpose(np.cos(np.arange(0, n) * np.pi * k * l))在for循环中的指令中提出了一个我不明白的警告,特别是对于np.transpose函数的参数,np.cos(np.arange(0, n) * np.pi * k * l).

预期类型'Union [ndarray,Iterable]',得到'int'而不是......

此检查检测函数调用表达式中的类型错误.由于动态调度和鸭子打字,这在有限但有用的情况下是可能的.函数参数的类型可以在文档字符串或Python 3函数注释中指定.

你能帮我解释一下这个警告吗?以及如何纠正它?写这样的指令的正确方法是什么?

hpa*_*ulj 9

我猜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])
Run Code Online (Sandbox Code Playgroud)


buz*_*jwa 8

PyCharm中的numpy代码会发生很多误报.在一个与JetBrains支持讨论这个问题的帖子中,他们说:

几乎所有以合理优雅的numpy风格编写的代码都会被警告消息淹没.

对于您自己的函数的参数,您可以编写文档字符串以让PyCharm知道期望的类型.对于很多numpy代码,但这不相关.我找到了两种解决方案:

  1. # noinspection PyTypeChecker使用警告发生的行或函数之前的行来抑制每行或每个函数的警告.有关抑制警告的更多详细信息,请参阅官方指南
  2. 使用类型提示,如下面的答案:

    transpose_arg = np.cos(np.arange(0, n) * np.pi * k * l)  # type: np.ndarray
    v = np.transpose(transpose_arg)
    
    Run Code Online (Sandbox Code Playgroud)