다른 포럼의 질문 일 수 있습니다. 알려 주시면 알려주세요. 나는 단지 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
github 예제에서 ... 재구성이 더 힘든 부분이었습니다. 또한, ND 계수 배열을 조작하는 것이 훨씬 쉽다는 것을 알았습니다. (계수 크기를 정렬하고 계수 크기에서 계수 함수를 빼는 것과 같습니다.) 마지막으로 계수의 합 제곱 크기는 샘플의 제곱 크기와 같습니다. 계수의 ND 큐브를 사용하는 경우 데이터. – fodon