20

Pythonで2次元DFTのDFT行列を取得する最も簡単な方法は何ですか? numpy.fftにそのような関数が見つかりませんでした。ありがとう!

4

7 に答える 7

17

最も簡単でおそらく最速の方法は、SciPy の fft を使用することです。

import scipy as sp

def dftmtx(N):
    return sp.fft(sp.eye(N))

もっと速い方法 (もっと複雑かもしれません) をご存知でしたら、ご意見をいただければ幸いです。

主な質問との関連性を高めるために、numpy を使用することもできます。

import numpy as np

dftmtx = np.fft.fft(np.eye(N))

私がそれらの両方をベンチマークしたとき、scipy の方がわずかに高速だったという印象がありますが、完全には実行していません。

Python での FFT 実装に関する非常に優れたソースは次 のとおりです: http://nbviewer.ipython.org/url/jakevdp.github.io/downloads/notebooks/UnderstandingTheFFT.ipynb時にはシンプルさも伴います。

于 2014-10-29T18:04:43.140 に答える
14

私はこれが組み込まれているとは思わない.しかし、直接計算は簡単です:

import numpy as np
def DFT_matrix(N):
    i, j = np.meshgrid(np.arange(N), np.arange(N))
    omega = np.exp( - 2 * pi * 1J / N )
    W = np.power( omega, i * j ) / sqrt(N)
    return W

EDIT 2D FFT マトリックスの場合、次を使用できます。

x = np.zeros(N, N) # x is any input data with those dimensions
W = DFT_matrix(N)
dft_of_x = W.dot(x).dot(W)
于 2013-11-02T06:38:13.180 に答える
2

@アレックス| は基本的に正しいです。2 次元 DFT に使用したバージョンをここに追加します。

def DFT_matrix_2d(N):
    i, j = np.meshgrid(np.arange(N), np.arange(N))
    A=np.multiply.outer(i.flatten(), i.flatten())
    B=np.multiply.outer(j.flatten(), j.flatten())
    omega = np.exp(-2*np.pi*1J/N)
    W = np.power(omega, A+B)/N
    return W
于 2013-11-02T22:05:15.780 に答える