【问题标题】:Expected type 'Union[ndarray, Iterable]' warning in Python instructionPython指令中的预期类型'Union [ndarray,Iterable]'警告
【发布时间】:2015-08-16 10:59:15
【问题描述】:

我已经将一个 Matlab 函数用于创建一个过完备离散余弦变换矩阵来表示这种矢量空间中的一维信号,并使用 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

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

我正在使用 PyCharm 作为 Python IDE,并且该软件在 for 循环内的指令 v = np.transpose(np.cos(np.arange(0, n) * np.pi * k * l)) 中引发了一个我不明白的警告,特别是针对 np.transpose 函数的参数 @987654325 @。

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

此检查检测函数调用表达式中的类型错误。到期的 对于动态调度和鸭子类型,这在有限但 有用的案例数。可以指定函数参数的类型 在文档字符串或 Python 3 函数注释中。

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

【问题讨论】:

  • 您能否将该表达式扩展为多个步骤,以便查看哪一个失败?

标签: python numpy pycharm warnings translate


【解决方案1】:

我猜 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])

【讨论】:

    【解决方案2】:

    这些误报在 PyCharm 中的 numpy 代码中经常发生。在thread discussing this issue with JetBrains support 中,他们说:

    几乎所有以相当优雅的 numpy 风格编写的代码都会淹没在警告消息中。

    对于您自己的函数的参数,您可以write docstrings to let PyCharm know what type to expect。但是对于很多 numpy 代码来说,这无关紧要。我找到了两种解决方案:

    1. 在出现警告的行或函数之前使用# noinspection PyTypeChecker 行抑制每行或每函数的警告。有关抑制警告的更多详细信息,请参阅official guide
    2. 使用type hinting,如this answer

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

    【讨论】:

      【解决方案3】:

      附加到 buzjwa 的答案:

      选项 3: 使用 mypy 进行类型检查并手动添加为 numpy here 创建的第 3 方存根文件

      您需要将此存根文件添加到您的内部 python 类型库中。让我们知道您的进展情况!

      【讨论】:

        猜你喜欢
        • 2017-11-12
        • 2016-01-27
        • 2022-01-05
        • 1970-01-01
        • 2022-01-08
        • 2021-06-11
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多