2013-04-12 15 views
8

私はlabviewで2D DCT-IIを作成していますが、出力が正しいことを確認できるようにしたいと考えています。 SciPyは、DCT-IIにデフォルトで設定されていて、1Dです。SciPy DCT関数を使用して2D DCT-IIを作成する

私はそれを2次元配列に対して機能させたいと考えています。これを行うには、列にDCTを適用し、DCTをこの結果の行に再度適用する必要があります。

私はこれを行うためにどのような機能を使用したいのか分かりません。

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.  ]]) 

は私が何を行う権利機能がrot90ではないと思われる。しかし、これは以下の出力

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)) 

を:私は次のように90度反時計回りにnumpyの配列を回転させるnp.rot90を試してみました私はやりたい、おそらくもっと良いものがあるだろうか?

答えて

14

私は、行を列に変換するので、回転があなたの望むものだとは思わないが、データの順序も混乱します。代わりにnp.transposeを使用してください。

のように、その後の行で、あなたが何かをするだろう、列で最初にDCTを適用するには:末尾.Tnp.transposeと同等です

dct(dct(a.T).T) 

。列を操作した後で転置を元に戻す必要があることに注意してください。

私はあなたがDCTを適用する順番、すなわち列その後、行列対そして行は、任意の違いは、しかし、あなたのように、その後の行の列を得ることができるとは思わない:

dct(dct(a).T).T 
21

@ハイメの答えは大丈夫です。この目的のためにdctaxisという引数があることを追加します。最初に軸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 
関連する問題