pythonによるウェーブレットパケット分解
7800 ワード
最近はちょうどpythonによるウェーブレット分解、見た英語のpywtライブラリの様々な属性と方法とその使用例を学習しているので、ここに記録しておくと、後で調べるのに便利で、前のウェーブレット分解部分が記録を忘れてしまい、ウェーブレットパケット分解からしか開始できません.ウェーブレットパケット:pywtライブラリを最初にインポート:
一、ウェーブレットパケット構造を作成する:次に、ウェーブレットパケットオブジェクトをインスタンス化する:
入力データと分解係数(詳細係数と近似係数)はすべてWaveletPacket.data取得:
ウェーブレットパケットツリーのノードはパスによって識別されます.ルートノードを識別するパスは''',ルートノードの分解層数は0である.
最大分解レイヤ数については、コンストラクション関数にパラメータが指定されていない場合に自動的に計算されます.
二、ウェーブレットパケットツリーを巡ってサブノードを取得する:
まず、最大分解層数を確認します.
次に、ウェーブレットパケットツリーのサブノードの取得を開始します. 1st level 2nd level 3rd level
以上、最大分解レイヤ数に達しました.次にループするとインデックスエラーが発生します.
間違ったパスを入力してみましょう.
value errorを生成します.
サブノードのプロパティを取得するには、次の手順に従います.
ウェーブレットパケットツリーオブジェクトは、列のサブノードオブジェクトを持つツリー構造です.ウェーブレットパケットはノードクラスの特殊なサブクラスにすぎない.ウェーブレットパケットツリーのノードは、obj[x](Node._getitem_()のオペレータによってアクセスできる.各ノードには、data,path,node_という一連のプロパティがあります.name,parent,level,maxlevel,mode.
条件を満たすノードを抽出するには、次の手順に従います.
特定のレイヤ上のすべてのノードを自然な順序で得ることができます.
または周波数帯域ごとにソートします.
注意、WaveletPacket.get_level()は、指定したレベルに達するまで自動分解を実行します.
ウェーブレットパケットツリーから信号を再構成するには、次の手順に従います.
ウェーブレットパケットツリーを新規作成し、ノードに値を割り当てます.
ノードオブジェクトからデータを自動的に抽出することもできます.
次に,aa,ad,dの3つのノードパケットのデータを再構成する.
reconstructメソッドのupdateパラメータがFalseに設定されている場合、ルートノードのデータは更新されません.
そうでない場合、ルートノードのdataプロパティは再構築後のデータに設定されます.
ウェーブレットツリーからノードを除去するには、次の手順に従います.
まず、2層のウェーブレットパケットツリーの分解から始めます.ツリーのサブノードは次のとおりです.
WPツリーからノードを削除するには、Pythonのdel obj[x](node.delitem_)を使用します.
ツリーの残りのノードは次のようになります.
この時点で信号を再構成すると、
削除したノードとその対応する値を復元します.
リーフノードとリビルド後の信号を印刷し、リビルド信号が正しいことを確認します.
不活性評価私の理解は、Lazy evaluation(不活性評価)は、式自体を格納し、評価しないことを意味します.評価が必要な場合は明確に評価させます.例えば:(defparameter temp(+2 3))この場合、tempは5に等しくLazyを用いる場合、(defparameter temp(lazy(+2 3))この場合tempは1つの式に等しく、さらにそれを評価する必要がある場合にevaluationを用います.式は必要なときに値を求めるだけで、繰り返しの計算を避けることができることが明らかになった.この言い方もあまり正確ではありませんが、正確な点の利点は、再帰的な方法で値を求める際に、使用されていない値を事前に行うことを避けることです.注:このセクションではpywtの内部コンポーネントのデモにのみ使用します.この例に示すノードへの属性アクセスを怠らないでください.1最初wpの属性aはNoneであった.
このような属性アクセス方式に甘んじないでください. 2 .まず、親ノード(wpオブジェクト自体)を分解することによって計算されるノードにアクセスしてみます. 3 .wpの属性aは、新しく作成されたノードに設定されている.
ノードdも同様に新しく作成されたノードに設定される.
>>> import pywt
一、ウェーブレットパケット構造を作成する:次に、ウェーブレットパケットオブジェクトをインスタンス化する:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> wp = pywt.WaveletPacket(data=x, wavelet='db1', mode='symmetric')
入力データと分解係数(詳細係数と近似係数)はすべて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
二、ウェーブレットパケットツリーを巡ってサブノードを取得する:
>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> wp = pywt.WaveletPacket(data=x, wavelet='db1', mode='symmetric')
まず、最大分解層数を確認します.
>>> print(wp.maxlevel)
3
次に、ウェーブレットパケットツリーのサブノードの取得を開始します.
>>> print(wp['a'].data)
[ 2.12132034 4.94974747 7.77817459 10.60660172]
>>> print(wp['a'].path)
a
>>> print(wp['aa'].data)
[ 5. 13.]
>>> print(wp['aa'].path)
aa
>>> print(wp['aaa'].data)
[ 12.72792206]
>>> print(wp['aaa'].path)
aaa
以上、最大分解レイヤ数に達しました.次にループするとインデックスエラーが発生します.
>>> 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(wp['ad'].data)
[-2. -2.]
>>> print(wp['ad'].path)
ad
>>> print(wp['ad'].node_name)
d
>>> print(wp['ad'].parent.path)
a
>>> print(wp['ad'].level)
2
>>> print(wp['ad'].maxlevel)
3
>>> print(wp['ad'].mode)
symmetric
条件を満たすノードを抽出するには、次の手順に従います.
>>> 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の3つのノードパケットのデータを再構成する.
>>> 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')
まず、2層のウェーブレットパケットツリーの分解から始めます.ツリーのサブノードは次のとおりです.
>>> 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は1つの式に等しく、さらにそれを評価する必要がある場合にevaluationを用います.式は必要なときに値を求めるだけで、繰り返しの計算を避けることができることが明らかになった.この言い方もあまり正確ではありませんが、正確な点の利点は、再帰的な方法で値を求める際に、使用されていない値を事前に行うことを避けることです.注:このセクションではpywtの内部コンポーネントのデモにのみ使用します.この例に示すノードへの属性アクセスを怠らないでください.
>>> x = [1, 2, 3, 4, 5, 6, 7, 8]
>>> wp = pywt.WaveletPacket(data=x, wavelet='db1', mode='symmetric')
>>> print(wp.a)
None
このような属性アクセス方式に甘んじないでください.
>>> print(wp['a'])
a: [ 2.12132034 4.94974747 7.77817459 10.60660172]
>>> print(wp.a)
a: [ 2.12132034 4.94974747 7.77817459 10.60660172]
ノードdも同様に新しく作成されたノードに設定される.
>>> print(wp.d)
d: [-0.70710678 -0.70710678 -0.70710678 -0.70710678]