2017-12-11 21 views
0

こんにちは、私は持っているデータの3D配列(xyz座標の磁場データ)にSav-gol filterを適用しようとしています。私はエラーを取得します:TypeError:期待されるxとyは同じ長さです。私の配列は460798ユニットで、各ユニットは座標[x y z]のリストです。私はそれがウィンドウサイズのパラメータで何かをしなければならないと思う。私は3つにそれを置く、それは正常に動作しますが、私のデータポイントは平滑化されていません。 3つより高い場合、動作しません。
私は3次元配列を平滑化する関数を取得しようとしています。SavGolフィルタは3次元配列で同じ長さのエラーを返します

mag = cdf['Mag'][start_ind:stop_ind) #mag is a 3-D array with coordinate element [x y z] 
mag_smoothed = signal.savgol_filter(x=mag, window_length=5, polyorder=2) 
print mag_smoothed[1] 

私は戻って平滑化3-Dの配列を取得することになってる、私は信じています。

File "/Users/sosa/research/Python Files/MagnometerPlot.py", line 33, in plot 
mag_smoothed = signal.savgol_filter(x=mag, window_length=7, polyorder=2,axis=1) 
File "/Users/sosa/anaconda/lib/python2.7/site-packages/scipy/signal/_savitzky_golay.py", line 339, in savgol_filter 
_fit_edges_polyfit(x, window_length, polyorder, deriv, delta, axis, y) 
File "/Users/sosa/anaconda/lib/python2.7/site-packages/scipy/signal/_savitzky_golay.py", line 217, in _fit_edges_polyfit 
polyorder, deriv, delta, y) 
File "/Users/sosa/anaconda/lib/python2.7/site-packages/scipy/signal/_savitzky_golay.py", line 187, in _fit_edge 
xx_edge, polyorder) 
File "/Users/sosa/anaconda/lib/python2.7/site-packages/numpy/lib/polynomial.py", line 559, in polyfit 
raise TypeError("expected x and y to have same length") 
TypeError: expected x and y to have same length 
+1

文書によれば、サイフィー・ザ・キツツキゴーレイ・フィルタは1Dフィルタである。軸を指定することもできます( 'axis = 0/1/2')。しかし、このフィルターを使用すると、一度に1軸の信号だけをフィルタリングすることができ、それがあなたの目的にふさわしいかどうかを考える必要があります。 – ikom

+0

@ikom、magリストのx、y、z成分を分離して各成分に別々にフィルタを適用すると、フィルタは複製されますか? – Sosa

答えて

0

do you think if I separate the x,y,z components of the mag list and apply the filter separately to each component, would the filter be replicated?

私はそれが妥当な近似することができると思いますが、それは非常に主観的だとあなたがあなたのデータをどうする計画しているかに依存します。精密測定を行う場合、データを処理する最良の方法ではないかもしれません。 ボリュームデータやサーフェスデータで作業しているかどうかはわかりません(zはx、yの大きさです)。私は例として3Dサーフェスを使用します。 (これは2次元の大きさの配列、arr1

SGを使ってサーフェスを滑らかにします。

scipyのSGフィルタでできること:1Dラインを滑らかにします。

しかし、表面はそう、我々は次のことを行う可能性があります、それを回避するために、横にライン側の単なる集合である:

1)arr1(軸= 0)のすべての行を滑らかに。私たちは、今、私たちはarr2内のすべての(軸= 1)と同じことを行う新しい配列、arr2

2)にすべての平滑化の行を入れて、名目上、である、arr3を生成し、「2D-平滑化」表面。

しかし、そうではありません。与えられたデータポイントに対して、1Dフィルタは、ポイント自体といくつかの隣接する値を考慮して新しい値を計算します。しかし、2Dセットでは、そのデータポイントの値が間違った行(または列)にあるため、そのデータポイントはより多く、隣接値になります。それが可能ならばおそらく別の価値に到達するでしょう。

段階的なスムージングが完璧ではないことを自信を持って確認する最も簡単な方法は、2回繰り返すことですが、2回目に戻します。最初に列と行に沿って作業します。完璧な世界では、あなたが行や列で始まったかどうかにかかわらず、最終的な結果が一致するはずです。それはあなたがたぶんそれらが少し違うことに気付くでしょう。

データが非常に均一で、ピークやジャンプが多くない場合(ノイズなど)は、おそらく問題はありません。そうしないと、2つの結果の間にさらに大きな違いが見られる場合があります。

すばらしいGoogle検索では、2D-Savitzky-Golayフィルタに関するさまざまな議論がありましたので、それを検討することは価値があるかもしれません。

関連する問題