7

다른 포럼의 질문 일 수 있습니다. 알려 주시면 알려주세요. 나는 단지 14 명이 웨이블릿 태그를 따르는 것을 알아 챘다.N 차원 데이터 작업을 위해 pyWavelets를 확장하는 방법은 무엇입니까?

여기 pywt (waveWavelets 패키지)의 웨이브 렛 분해를 여러 차원으로 확장하는 우아한 방법이 있습니다. pywt가 설치된 경우에는이 옵션을 실행해야합니다. 테스트 1은 3D 배열의 분해 및 재구성을 보여줍니다. 모두 하나의 치수를 늘리면 코드가 4, 6 또는 18 차원의 데이터로 분해/재구성 할 수 있습니다.

여기서 pywt.wavedec 및 pywt.waverec 함수를 대체했습니다. 또한 fn_dec에서 새 wavedec 함수가 이전 함수와 어떻게 비슷한 방식으로 작동하는지 보여줍니다.

하나의 catch가 있습니다. 웨이블릿 계수를 데이터와 동일한 모양의 배열로 나타냅니다. 결과적으로 웨이블릿에 대한 제한된 지식으로 인해, Haar 웨이브 렛에만 사용할 수있었습니다. 예를 들어 DB4와 같은 다른 것들은이 엄격한 경계의 가장자리에있는 계수를 추출합니다 (배열 목록 [CA, CD1 ... CDN]의 계수의 현재 표현에는 문제가되지 않습니다.) 또 다른 캐치는 2^N 에지 직각 자 데이터

이론적으로, "출혈"이 발생하지 않도록해야한다고 생각합니다. 이러한 종류의 웨이브 렛 분해 및 재구성 알고리즘은 "C의 수치 식 수식" - William Press, Saul A teukolsky, William T. Vetterling 및 Brian P. Flannery (Second Edition)이 알고리즘은 다른 형태의 가장자리 확장 (예 : zpd)보다는 가장자리에서의 반사를 가정하지만이 방법은 다른 형태의 확장을 위해 노력하십시오.

이 작품을 다른 웨이블릿으로 확장하는 방법에 관한 내용은?

참고 :이 쿼리는 또한, http://groups.google.com/group/pywavelets

덕분에 AJO

import pywt 
import sys 
import numpy as np 

def waveFn(wavelet): 
    if not isinstance(wavelet, pywt.Wavelet): 
     return pywt.Wavelet(wavelet) 
    else: 
     return wavelet 

# given a single dimensional array ... returns the coefficients. 
def wavedec(data, wavelet, mode='sym'): 
    wavelet = waveFn(wavelet) 

    dLen = len(data) 
    coeffs = np.zeros_like(data) 
    level = pywt.dwt_max_level(dLen, wavelet.dec_len) 

    a = data  
    end_idx = dLen 
    for idx in xrange(level): 
     a, d = pywt.dwt(a, wavelet, mode) 
     begin_idx = end_idx/2 
     coeffs[begin_idx:end_idx] = d 
     end_idx = begin_idx 

    coeffs[:end_idx] = a 
    return coeffs 

def waverec(data, wavelet, mode='sym'): 
    wavelet = waveFn(wavelet) 

    dLen = len(data) 
    level = pywt.dwt_max_level(dLen, wavelet.dec_len) 

    end_idx = 1 
    a = data[:end_idx] # approximation ... also the original data 
    d = data[end_idx:end_idx*2]  
    for idx in xrange(level): 
     a = pywt.idwt(a, d, wavelet, mode) 
     end_idx *= 2 
     d = data[end_idx:end_idx*2] 
    return a 

def fn_dec(arr): 
    return np.array(map(lambda row: reduce(lambda x,y : np.hstack((x,y)), pywt.wavedec(row, 'haar', 'zpd')), arr)) 
    # return np.array(map(lambda row: row*2, arr)) 

if __name__ == '__main__': 
    test = 1 
    np.random.seed(10) 
    wavelet = waveFn('haar') 
    if test==0: 
     # SIngle dimensional test. 
     a = np.random.randn(1,8) 
     print "original values A" 
     print a 
     print "decomposition of A by method in pywt" 
     print fn_dec(a) 
     print " decomposition of A by my method" 
     coeffs = wavedec(a[0], 'haar', 'zpd') 
     print coeffs 
     print "recomposition of A by my method" 
     print waverec(coeffs, 'haar', 'zpd') 
     sys.exit() 
    if test==1: 
     a = np.random.randn(4,4,4) 
     # 2 D test 
     print "original value of A" 
     print a 

     # decompose the signal into wavelet coefficients. 
     dimensions = a.shape 
     for dim in dimensions: 
      a = np.rollaxis(a, 0, a.ndim) 
      ndim = a.shape 
      #a = fn_dec(a.reshape(-1, dim)) 
      a = np.array(map(lambda row: wavedec(row, wavelet), a.reshape(-1, dim))) 
      a = a.reshape(ndim) 
     print " decomposition of signal into coefficients" 
     print a 

     # re-composition of the coefficients into original signal 
     for dim in dimensions: 
      a = np.rollaxis(a, 0, a.ndim) 
      ndim = a.shape 
      a = np.array(map(lambda row: waverec(row, wavelet), a.reshape(-1, dim))) 
      a = a.reshape(ndim) 
     print "recomposition of coefficients to signal" 
     print a 

답변

5

우선을 게시, 난 이미 Single-level Multi-dimensional Transform (Source)를 구현하는 기능을 지적하고 싶습니다. n 차원 계수 배열 사전을 반환합니다. 계수는 각 차원에 적용된 변형 유형 (근사/세부 정보)을 설명하는 키에 의해 지정됩니다. 결과 근사 상세 계수 어레이와 사전 인 2D 경우를 예를 들어

: aa가 근사치 계수 어레이는 두 차원 (LL) 및 da인가 변환이다

>>> pywt.dwtn([[1,2,3,4],[3,4,5,6],[5,6,7,8],[7,8,9,10]], 'db1') 
{'aa': [[5.0, 9.0], [13.0, 17.0]], 
'ad': [[-1.0, -1.0], [-1.0, -1.0]], 
'da': [[-2.0, -2.0], [-2.0, -2.0]], 
'dd': [[0.0, 0.0], [0.0, -0.0]]} 

는 계수이며 첫 번째 차원에 적용된 세부 변형을 사용하고 두 번째 차원 (HL)에 적용된 근사 변환을 가진 배열 (dwt2 output과 비교).

이를 토대로 다단계 사례로 확장하는 것이 매우 쉽습니다.

여기 내 분해 부분에 대한 내용은 https://gist.github.com/934166입니다.

나는 또한 당신이 당신의 질문에서 언급 한 문제를 해결하고 싶습니다 :이 하나 개 잡을 생각입니다

: 그것은 가 으로 데이터와 동일한 형태의 배열을 웨이블릿 계수를 나타냅니다.

입력 데이터와 동일한 모양/크기의 배열로 결과를 표시하는 방식은 제 생각에는 해롭습니다. 어쨌든 출력 배열의 계수에 액세스하고 역변환을 수행 할 수 있도록 색인을 사용하여 가정을하거나 보조 데이터 구조를 유지해야하기 때문에 모든 것이 불필요하게 복잡하고 이해하기 쉽습니다 (wavedec/waverec에 대한 Matlab의 설명서 참조).).

또한 종이에서 훌륭하게 작동하지만 실제로 언급 한 문제로 인해 실제 응용 프로그램과 맞지는 않습니다. 대부분의 경우 입력 데이터 크기가 2^n이 아니며 신호의 컨볼 루션 결과 잔물결 필터는 "저장 공간"보다 크므로 데이터 손실 및 완전하지 않은 재구성으로 이어질 수 있습니다.

이러한 문제를 피하려면 Python의 목록, 사전 및 튜플 (사용 가능한 경우)과 같은 결과 데이터 계층 구조를 나타내는 데 더 자연스러운 데이터 구조를 사용하는 것이 좋습니다.

+1

github 예제에서 ... 재구성이 더 힘든 부분이었습니다. 또한, ND 계수 배열을 조작하는 것이 훨씬 쉽다는 것을 알았습니다. (계수 크기를 정렬하고 계수 크기에서 계수 함수를 빼는 것과 같습니다.) 마지막으로 계수의 합 제곱 크기는 샘플의 제곱 크기와 같습니다. 계수의 ND 큐브를 사용하는 경우 데이터. – fodon