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