これは別のフォーラムへの質問かもしれません。もしそうなら、私に知らせてください。ウェーブレットタグをフォローしているのは14人だけであることに気づきました。
ここでは、pywt(pyWaveletsパッケージ)のウェーブレット分解を複数の次元に拡張するエレガントな方法を紹介します。pywtがインストールされている場合、これは箱から出して実行する必要があります。テスト1は、3Dアレイの分解と再構成を示しています。必要なのは、次元数を増やすことだけです。コードは、4、6、または18次元のデータで分解/再構成する際に機能します。
ここでpywt.wavedec関数とpywt.waverec関数を置き換えました。また、fn_decでは、新しいwavedec関数が古い関数と同じように機能することを示しています。
ただし、1つの落とし穴があります。それは、ウェーブレット係数をデータと同じ形状の配列として表します。結果として、ウェーブレットに関する知識が限られているため、ハールウェーブレットにしか使用できませんでした。DB4のような他の例では、この厳密な境界の端で係数をブリードします(配列のリストとしての係数の現在の表現[CA、CD1 ... CDN]では問題ありません。もう1つの問題は、これを2でしか処理していないことです。データの^Nエッジ直方体。
理論的には、「出血」が起こらないようにすることは可能だと思います。この種のウェーブレット分解と再構成のアルゴリズムは、William Press、Saul A teukolsky、William T. Vetterling、Brian P. Flannery(Second Edition)による「Cの数値レシピ」で説明されています。このアルゴリズムは、他の形式のエッジ拡張(zpdなど)ではなく、エッジでの反射を想定していますが、この方法は、他の形式の拡張で機能するのに十分一般的です。
この作業を他のウェーブレットに拡張する方法について何か提案はありますか?
注:このクエリはhttp://groups.google.com/group/pywaveletsにも投稿されています
ありがとう、阿城
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