Python for .NETの新しい話 Vol. 2
Pythonでsgolayフィルタを使ってみた..NETでもオープンソースのコードがないかなと思っていたのですが,なかなか見つからなかったのでscipyのコードを使うことにしてみた.
自分で探していたけど「SciPy で Savitzky-Golay フィルタ」という参考にmodeなるものも指定できることが分かった.SciPyの方が簡単かな
やっぱり簡単.ただし,Scipyはかなりストレージを使う.これを小さくできたらよいのだが...
C#側のコードは次のような感じにしてみた.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Python.Runtime; namespace SgolaySample { public partial class Form1 : Form { public Form1() { InitializeComponent(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); // // chart1 // chartArea1.Name = "ChartArea1"; this.chart1.ChartAreas.Add(chartArea1); legend1.Name = "Legend1"; this.chart1.Legends.Add(legend1); this.chart1.Location = new System.Drawing.Point(12, 12); this.chart1.Name = "chart1"; series1.ChartArea = "ChartArea1"; series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; series1.Legend = "Legend1"; series1.Name = "Series1"; series2.ChartArea = "ChartArea1"; series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; series2.Legend = "Legend1"; series2.Name = "Series2"; this.chart1.Series.Add(series1); this.chart1.Series.Add(series2); this.chart1.Size = new System.Drawing.Size(446, 206); this.chart1.TabIndex = 0; this.chart1.Text = "chart1"; this.Controls.Add(this.chart1); string strPath = Environment.GetEnvironmentVariable("PATH"); string appDir = Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName + @"\python"; Environment.SetEnvironmentVariable("PATH", Path.PathSeparator + appDir, EnvironmentVariableTarget.Process); List<double> x = new List<double>(); // Python listへの変換予定 List<double> y = new List<double>(); // Python listへの変換予定 Random random = new Random(0); for (int i = 0; i < 400; i++) { x.Add(0.01 * i); y.Add(Math.Sin(2.0 * Math.PI * x[i] / 1.0) + random.NextDouble()); } using (Py.GIL()) { dynamic sys = Py.Import("sys"); // sample.pyを置くフォルダをパスに追加 sys.path.append(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName); } using (Py.GIL()) { dynamic sample = Py.Import("sample"); dynamic ya = sample.filterA(y); // numpy.arrayで返ってくる予定 for (int i = 0; i < x.Count; i++) { chart1.Series[0].Points.AddXY(x[i], y[i]); chart1.Series[1].Points.AddXY(x[i], ((double[])ya)[i]); } } } } }
sample.pyの例
import numpy as np from scipy import signal def filterA(y): ya = signal.savgol_filter(y, 101, 5); return ya;
タグ:Python , Windows Forms