我正在labview中创建2D DCT-II,但希望能够检查我的输出是否正确.SciPy有一个很好的DCT功能,默认为DCT-II但是1D.
我想让它适用于2D数组.为此,必须将DCT应用于列,然后必须再次将DCT应用于此结果的行.
我不确定我想用它做什么功能.我试过np.rot90,它将numpy数组逆时针旋转90度,如下所示:
import numpy as np
from scipy.fftpack import dct
a = np.array([[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]])
b = dct(np.rot90(dct(a),3))
Run Code Online (Sandbox Code Playgroud)
但是,这会输出以下内容:
array([[ 1152. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ -412.30867345, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ -43.10110726, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ -12.85778584, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. ],
[ -3.24494866, 0. , 0. , 0. ,
0. , 0. , 0. , 0. ]])
Run Code Online (Sandbox Code Playgroud)
我认为rot90不是做我想做的事情的正确功能,也许有更好的功能?
War*_*ser 28
@ Jaime的答案很好.我要补充一点dct就是axis为了这个目的.首先应用它,比如轴0,然后沿结果的轴1:
In [30]: from scipy.fftpack import dct
In [31]: a.shape
Out[31]: (8, 8)
In [32]: t1 = dct(dct(a, axis=0), axis=1)
In [33]: t2 = dct(dct(a.T).T)
In [34]: np.abs(t1 - t2).max()
Out[34]: 0.0
Run Code Online (Sandbox Code Playgroud)
Jai*_*ime 16
我不认为旋转是你想要的,因为它将行转换为列,但它也与数据的顺序混淆.请np.transpose改用.
要先按列应用dct,然后按行应用dct,您可以执行以下操作:
dct(dct(a.T).T)
Run Code Online (Sandbox Code Playgroud)
尾随.T相当于np.transpose.请注意在对列进行操作后需要撤消转置,以便再次按行对齐返回.
我不认为你应用dct的顺序,即列然后行与行然后列,有任何区别,但你可以得到行然后列为:
dct(dct(a).T).T
Run Code Online (Sandbox Code Playgroud)
现在还有一个多维 DCT 函数(和逆函数):
>>> from scipy.fft import dctn, idctn
>>> b = dctn(a)
>>> np.allclose(a, idctn(b))
True
Run Code Online (Sandbox Code Playgroud)
https://docs.scipy.org/doc/scipy/reference/ generated/scipy.fft.dctn.html