제 작품에서는 큰 이미지에서 이산 푸리에 변환 (DFT)을 수행해야합니다. 현재 예제에서 나는 1921 x 512 x 512 이미지 (512 x 512 이미지의 2D FFT와 함께)에 3D FT가 필요합니다. 지금 당장 numpy 패키지와 관련 함수 np.fft.fftn()을 사용하고 있습니다.비교적 느린 파이썬 numpy 3D 푸리에 변환
import sys
import numpy as np
import time
tas = time.time()
a = np.random.rand(512, 512)
tab = time.time()
b = np.random.rand(100, 512, 512)
tbfa = time.time()
fa = np.fft.fft2(a)
tfafb = time.time()
fb = np.fft.fftn(b)
tfbe = time.time()
print "initializing 512 x 512 grid:", tab - tas
print "initializing 100 x 512 x 512 grid:", tbfa - tab
print "2D FFT on 512 x 512 grid:", tfafb - tbfa
print "3D FFT on 100 x 512 x 512 grid:", tfbe - tfafb
출력 :
initializing 512 x 512 grid: 0.00305700302124
initializing 100 x 512 x 512 grid: 0.301637887955
2D FFT on 512 x 512 grid: 0.0122730731964
3D FFT on 100 x 512 x 512 grid: 3.88418793678
예시 아래의 코드는 다음과 같은 방법으로 동일한 크기의/약간 작은 2D/3D 난수 생성 된 그리드에 2D와 3D FFT 시간을 보여줍니다 문제는 내가이 과정을 아주 자주 필요로하기 때문에 이미지 당 보낸 시간이 짧아야한다는 것입니다. 내 컴퓨터에서 테스트 할 때 (중간 세그먼트 랩톱, 가상 컴퓨터에 할당 된 2GB RAM (-> 그러므로 더 작은 테스트 그리드)), 3D FFT는 ~ 5 초 (크기 순서)를가집니다. 이제는 직장에서 기계가 더 나은 방법으로, 클러스터/그리드 아키텍처 시스템과 FFT가 훨씬 빠릅니다. 두 경우 모두 2D가 즉시 준 준공합니다.
그러나 1921x512x512의 경우 np.fft.fftn()은 ~ 5 분이 소요됩니다. scipy의 구현이 그리 빠르지 않다고 생각하고 동일한 크기의 격자가있는 MATLAB FFT에서 ~ 5 초 내에 끝나는 것을 고려할 때 제 질문은 MATLAB 시간까지 프로세스를 가속화하는 방법이 있는지 여부입니다. FFT에 대한 나의 지식은 제한되어 있지만, 분명히 MATLAB은 FFTW 알고리즘을 사용하는데, 파이썬에서는 그렇지 않습니다. 어떤 pyFFTW 패키지와 비슷한 시간에 얻을 수있는 합리적인 기회가 있습니까? 또한 1921 년은 불행한 선택인데, 2 가지 주요 요인 (17, 113) 만 가지고 있기 때문에이 또한 중요한 역할을한다고 가정합니다. 반면에 512는 2의 적절한 힘입니다. 가능한 경우 MATLAB과 같은 시간을 2048까지 0으로 채우지 않고도 달성 할 수 있습니까?
FFT를 많이 사용해야 할 것입니다. (그러한 차이가 엄청난 영향을 줄 수있는 금액으로!) 파이썬에서 계산 시간을 줄일 가능성이없는 경우, 다른 빠른 구현으로 전환 할 수 있습니다.
pyfftw가 실패하면 R 또는 옥타브의 fft 구현과 비교해보십시오. 그 중 어떤 것이 더 빠르면 파이썬에서 그 구현을 호출 할 수있다. (벌금이 얼마나 클지 모르겠다.) – xvan