C# – IronPython データ連携
C#とIronPythonを連携させようと思ったのは、Pythonの数値計算ライブラリNumPyがIronPythonでもインストールできるというサイトを見つけたからです。(また、VSTOでExcelのデータ処理にも使えればと)
https://www.enthought.com/repo/.iron/
これを使って、C#、IronPython間のデータの受け渡しテストをしてみました。
環境 : IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.296 (32-bit), Visual Studio 2010 / Windows 7
インストール
1)ironpkg-1.0.0.pyをダウンロード
2)以下コマンド実行
ipy ironpkg-1.0.0.py –install
ironpkg scipy
ipy -X:Frames -c “import scipy”
いろいろと調べてトライしましたが、残念ながらSciPyは使えないようです。しかしNumPyは使えるので、こちらだけ使いました。
(NumPyだけできるものにしました)
csTest.py
import sys sys.path.append(r'C:\Program Files (x86)\IronPython 2.7') sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\DLLs') sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib') sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib\site-packages') import clr clr.AddReference('mtrand.dll') import numpy as np na = np.zeros(shape=(2,2)) for i in range(2): for j in range(2): na[i, j] = mx[i, j] mr = np.linalg.inv(na) print '- Iron Python -' print mr print np.dot(na, mr) for i in range(2): for j in range(2): mx[i, j] = float(mr[i, j])
C#で設定した2次元配列のデータをNumPyを使って逆行列の計算をして戻すというものです。
しかしC#の配列からのNumPy配列に渡す(その逆も)やり方ついていろいろと悩みました。
mxのままだと逆行列を求める関数でエラーをだしました。(np.array(mx)とやるときは、mxはジャグ配列([][])でないといけないみたいだし・・)
結果代入という形にしてしまいましたが、もっといい方法がないかまた調べたいと思います。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using IronPython.Hosting; using Microsoft.Scripting.Hosting; using System.Collections; using IronPython.Runtime; namespace csPyTest { class Program { static void Main(string[] args) { var pe = Python.CreateEngine(); ScriptSource src = pe.CreateScriptSourceFromFile(@"C:\csTest.py"); ScriptScope scope = pe.CreateScope(); double[,] mx = new double[,] {{0,1},{2,3}}; scope.SetVariable("mx", mx); src.Execute(scope); var m = scope.GetVariable<double[,]>("mx"); Console.WriteLine(" - C# - "); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { Console.Write(m[i, j] + " "); } Console.WriteLine(); } Console.ReadLine(); } } }
C#からダイナミック言語のPythonの変数に直接アクセスできるのも、強力な機能ですね。しかしもうすこしCPythonのライブラリが使えるようになってほしいところです。
以下は実行結果です。逆行列の確認として、単位行列を出力しています。