我已经翻译了一个Matlab函数来创建一个Overcomplete Discrete Cosine Transform矩阵来表示这种矢量空间中的1D信号到Python语言。
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
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
的参数功能,np.cos(np.arange(0, n) * np.pi * k * l)
。
预期类型'Union [ndarray,Iterable]',得到'int'而不是......
此检查检测函数调用表达式中的类型错误。应有 动态调度和鸭子打字,这是有限的但可能 有用的案件数量。可以指定函数参数的类型 在docstrings或Python 3函数注释中。
你能为我解释这个警告吗?以及如何纠正它?写这样的指令的正确方法是什么?
答案 0 :(得分:8)
我猜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])
答案 1 :(得分:8)
这些误报在PyCharm中的numpy代码中发生了很多。在thread discussing this issue with JetBrains support中,他们说:
几乎所有以合理优雅的numpy风格编写的代码都会被警告信息淹没。
对于你自己职能的论据,你可以write docstrings to let PyCharm know what type to expect。对于很多numpy代码,但这不相关。我找到了两种解决方案:
# noinspection PyTypeChecker
抑制每行或每个函数的警告。有关抑制警告的详细信息,请参阅official guide transpose_arg = np.cos(np.arange(0, n) * np.pi * k * l) # type: np.ndarray
v = np.transpose(transpose_arg)
答案 2 :(得分:0)