用python进行小波包分解
由于最近正好在學(xué)習(xí)用python進(jìn)行小波分解,看的英文的pywt庫(kù)的各種屬性和方法及其使用示例,在這里記錄下來(lái),方便以后查閱,前面的小波分解部分忘了記錄了,就只能從小波包分解開始了。
小波包:
首先導(dǎo)入pywt庫(kù):
一、創(chuàng)建小波包結(jié)構(gòu):
接下來(lái)我們實(shí)例化一個(gè)小波包對(duì)象:
輸入數(shù)據(jù)和分解系數(shù)(細(xì)節(jié)系數(shù)和逼近系數(shù))都可以通過WaveletPacket.data得到:
>>> print(wp.data) [1, 2, 3, 4, 5, 6, 7, 8]小波包樹的節(jié)點(diǎn)由路徑標(biāo)識(shí)。標(biāo)識(shí)根節(jié)點(diǎn)的路徑是’ ',根節(jié)點(diǎn)的分解層數(shù)為0。
>>> print(repr(wp.path)) '' >>> print(wp.level) 0關(guān)于最大分解層數(shù),如果構(gòu)造函數(shù)中沒有指定參數(shù),則自動(dòng)計(jì)算。
>>> print(wp['ad'].maxlevel) 3二、遍歷小波包樹
獲取子節(jié)點(diǎn):
首先要先檢查最大分解層數(shù):
>>> print(wp.maxlevel) 3下面開始獲取小波包樹的子節(jié)點(diǎn):
- 1st level
- 2nd level
- 3rd level
以上,我們已經(jīng)達(dá)到了最大分解層數(shù),如果接著往下遍歷會(huì)產(chǎn)生一個(gè)索引錯(cuò)誤。
>>> print(wp['aaaa'].data) Traceback (most recent call last): ... IndexError: Path length is out of range.現(xiàn)在我們嘗試一下輸入錯(cuò)誤的路徑:
>>> print(wp['ac']) Traceback (most recent call last): ... ValueError: Subnode name must be in ['a', 'd'], not 'c'.產(chǎn)生一個(gè)value error。
獲取子節(jié)點(diǎn)屬性:
小波包樹對(duì)象是一個(gè)樹狀結(jié)構(gòu),擁有一系列子節(jié)點(diǎn)對(duì)象。小波包只是節(jié)點(diǎn)類中的一個(gè)特殊子類。
小波包樹的節(jié)點(diǎn)可以通過以下操作符來(lái)進(jìn)行訪問:obj[x] (Node.__ getitem__()).每一個(gè)節(jié)點(diǎn)都有一系列屬性:data,path,node_name,parent,level,maxlevel 和 mode。
提取符合條件的節(jié)點(diǎn):
>>> x = [1, 2, 3, 4, 5, 6, 7, 8] >>> wp = pywt.WaveletPacket(data=x, wavelet='db1', mode='symmetric')我們可以按自然順序得到特定層上的所有節(jié)點(diǎn):
>>> print([node.path for node in wp.get_level(3, 'natural')]) ['aaa', 'aad', 'ada', 'add', 'daa', 'dad', 'dda', 'ddd']或者按頻帶頻率進(jìn)行排序:
>>> print([node.path for node in wp.get_level(3, 'freq')]) ['aaa', 'aad', 'add', 'ada', 'dda', 'ddd', 'dad', 'daa']注意,WaveletPacket.get_level()也會(huì)執(zhí)行自動(dòng)分解,直到達(dá)到指定的級(jí)別。
從小波包樹重構(gòu)信號(hào):
>>> x = [1, 2, 3, 4, 5, 6, 7, 8] >>> wp = pywt.WaveletPacket(data=x, wavelet='db1', mode='symmetric')現(xiàn)在新建一個(gè)小波包樹,并且給它的節(jié)點(diǎn)賦一些值。
>>> new_wp = pywt.WaveletPacket(data=None, wavelet='db1', mode='symmetric')>>> new_wp['aa'] = wp['aa'].data >>> new_wp['ad'] = [-2., -2.]為了方便,也可以從節(jié)點(diǎn)對(duì)象中自動(dòng)提取數(shù)據(jù):
>>> new_wp['d'] = wp['d']接下來(lái),對(duì)aa,ad,d這三個(gè)節(jié)點(diǎn)包中的數(shù)據(jù)進(jìn)行重構(gòu)。
>>> print(new_wp.reconstruct(update=False)) [ 1. 2. 3. 4. 5. 6. 7. 8.]如果reconstruct方法中的update參數(shù)被設(shè)置為False,那么根節(jié)點(diǎn)的數(shù)據(jù)將不會(huì)被更新。
>>> print(new_wp.data) None否則,根節(jié)點(diǎn)的data屬性將被設(shè)置為重建后的數(shù)據(jù)。
>>> print(new_wp.reconstruct(update=True)) [ 1. 2. 3. 4. 5. 6. 7. 8.] >>> print(new_wp.data) [ 1. 2. 3. 4. 5. 6. 7. 8.] >>> print([n.path for n in new_wp.get_leaf_nodes(False)]) ['aa', 'ad', 'd'] >>> print([n.path for n in new_wp.get_leaf_nodes(True)]) ['aaa', 'aad', 'ada', 'add', 'daa', 'dad', 'dda', 'ddd']從小波包樹中移除節(jié)點(diǎn):
>>> x = [1, 2, 3, 4, 5, 6, 7, 8] >>> wp = pywt.WaveletPacket(data=x, wavelet='db1', mode='symmetric')首先,從一個(gè)二層的小波包樹分解開始,樹中的子節(jié)點(diǎn)是:
>>> dummy = wp.get_level(2) >>> for n in wp.get_leaf_nodes(False): ... print(n.path, format_array(n.data)) aa [ 5. 13.] ad [-2. -2.] da [-1. -1.] dd [ 0. 0.] >>> node = wp['ad'] >>> print(node) ad: [-2. -2.]要從WP樹中刪除一個(gè)節(jié)點(diǎn),可以使用Python的del obj[x] (node . __ delitem __):
>>> del wp['ad']于是,樹中剩余的節(jié)點(diǎn)為:
>>> for n in wp.get_leaf_nodes(): ... print(n.path, format_array(n.data)) aa [ 5. 13.] da [-1. -1.] dd [ 0. 0.]如果此時(shí)重構(gòu)信號(hào)的話:
>>> print(wp.reconstruct()) [ 2. 3. 2. 3. 6. 7. 6. 7.]現(xiàn)在恢復(fù)刪除的節(jié)點(diǎn)及其對(duì)應(yīng)的值:
>>> wp['ad'].data = node.data打印葉子節(jié)點(diǎn)和重建后的信號(hào),確認(rèn)重構(gòu)信號(hào)是正確的。
>>> for n in wp.get_leaf_nodes(False): ... print(n.path, format_array(n.data)) aa [ 5. 13.] ad [-2. -2.] da [-1. -1.] dd [ 0. 0.] >>> print(wp.reconstruct()) [ 1. 2. 3. 4. 5. 6. 7. 8.]惰性求值
我的理解是:
Lazy evaluation(惰性求值)的意思是把一個(gè)表達(dá)式本身存儲(chǔ)起來(lái),并不進(jìn)行求值。需要求值的時(shí)候再明確的讓它求值。
如:(defparameter temp (+ 2 3))這種情況下,temp等于5
如果用Lazy, (defparameter temp (lazy (+ 2 3)) 這時(shí)temp等于一個(gè)表達(dá)式,再需要對(duì)它進(jìn)行求值的時(shí)候用(force temp)把它evaluation。
它顯而易見的好處是表達(dá)式只需要在需要的時(shí)候求值,可以避免了重復(fù)的計(jì)算。這個(gè)說(shuō)法也不太準(zhǔn)確,準(zhǔn)確點(diǎn)的好處是在使用遞歸方法求值時(shí)避免了提前進(jìn)行沒有用到的求值。
注意:本節(jié)僅用于演示pywt的內(nèi)部組件。不要依懶于本例中所示的對(duì)節(jié)點(diǎn)的屬性訪問。
- 1 一開始wp的屬性a是None。
要記得千萬(wàn)不要依懶于這種屬性訪問方式。
- 2 .首先嘗試訪問節(jié)點(diǎn),它是通過分解其父節(jié)點(diǎn)(wp對(duì)象本身)計(jì)算出來(lái)的。
- 3 .現(xiàn)在wp的屬性a已經(jīng)被設(shè)置成了新創(chuàng)建的節(jié)點(diǎn)。
節(jié)點(diǎn)d也同樣被設(shè)置成了新創(chuàng)建的節(jié)點(diǎn)。
>>> print(wp.d) d: [-0.70710678 -0.70710678 -0.70710678 -0.70710678]總結(jié)
以上是生活随笔為你收集整理的用python进行小波包分解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java输入、输出流的简单入门
- 下一篇: Python小练习——电影数据集TMDB