2017-04-17 4 views
1

pyfft을 사용하여 2 차원 배열의 행 하위 집합에 대한 이산 푸리에 변환을 반복적으로 계산하고 싶습니다. 이전 행의 결과에 따라 변환해야하는 행을 미리 알 수 없습니다. 나는 모든 행에 대해 그렇게하는 것이 낭비라는 것을 알고있다.pyfftw의 행 계획 및 하위 집합

FFTW3의 '계획'은 변환 유형 (c2c, r2c 등) 및 입력/출력 길이 (항상 1D 경우의 벡터)와 관련되어 있습니다. pyfftw에서 '계획'은 변환 형식과 입출력 모양과 관련되어 있으므로 내 해석은 모든 행에 대해 동일한 FFTW3 계획을 사용한다는 것입니다.

내 질문은 :이 행의 가능한 모든 조합에 대해 별도의 pyfftw.FFTW 객체를 생성하지 않고, 행의 일부에 대해 동일한 FFTW3 계획을 사용할 수 있습니까?

다른 메모에서 나는 pyfftw이 다중 코어를 사용하는 방법이 궁금합니다 : 각 행에 대해 복수 코어를 사용합니까 (이것은 FFTW3 문서의보기에 자연스럽게 표시됩니다) 또는 다른 코어를 다른 코어로 재배치합니까? 초기 가정)?

답변

0

보기에서 numpy 배열을 만들 수있는 경우 pyFFTW를 사용하여 배열을 만들 수 있습니다. 유효한 모든 numpy 배열 으로 잘 작동해야합니다.

이 여러 가지 의미 :

  1. 귀하의 배열이 규칙적인 진보를 가질 필요가 있지만, 그 발전은 임의의 수 있습니다.
  2. ND 배열은 선택된 축이 사용되는 ND 변환으로 계획됩니다.
  3. 스트라이드 트릭을 사용하면 교활한 기교를 만끽할 수있을 것입니다. (아마도 겹쳐진 행처럼 사악한 일을하고 스레드를 사용한다면 기대했던대로 작동하지 않을 수도 있습니다).

내가 꽤 많이 사용한 한 가지 해결책은 임시 배열로 변환 할 행을 복사하고 변환하는 것입니다. 가장 빠른 옵션입니다 (특히 바이트 오프셋을 올바르게 가져올 수있는 경우).

분명히 다른 수의 행이있는 경우 분명히 작동하지 않습니다. 변형 된 행 수가 가장 많은 행을 계획하고 하위 집합에서 복사하는 경우에도 여전히 그렇지 않은 경우보다 빠르게 수행 할 수 있습니다.

C 레벨로 내려가더라도 문제가 발생한다는 것은 변환 크기를 자주 변경하는 경우 계획 오버 헤드가 우세 할 수 있다는 것입니다.

또한 일반적으로 numpy보다 빠르며 반복되는 변환 크기를 캐시 할 수있는 pyfftw.interfaces.numpy_fft을 시도 할 수도 있습니다.

+0

헨리, pyfftw와 빠른 답장을 보내 주셔서 감사합니다! 두 번째 글 머리 기호 항목을 명확히 해 주시겠습니까? 2D 배열에 대해 축 "-1"만 선택하면 단일 행 (예 : 첫 번째 행)에 대해서만 계획이 수행됩니까? 나는 pyfftw.interfaces.numpy_fft를 시도했으며 훌륭하게 작동하지만 내 컴퓨터에서 조금 더 많은 주스를 쥐어 짜려고합니다. 또한 내 두 번째 질문에 대해 말할 수 있다면 감사하겠습니다. – Ton

+0

아니요, axes 인수는 사용할 특정 조각이 아닌 사용할 축을 pyFFTW에 알려줍니다.배열을 분할하려면 먼저 배열을 분할해야합니다. –

+0

자세한 내용은 귀하의 pyfftw 코드뿐만 아니라 FFTW 설명서를 공부 후, 내 질문에 대한 자세한 내용은 FFTW에 대한 pyfftw에 대한보다 깨달았다. 세부 정보는 [여기] (https://stackoverflow.com/questions/44503726)입니다. – Ton