Windows Dev. Site

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のライブラリが使えるようになってほしいところです。

以下は実行結果です。逆行列の確認として、単位行列を出力しています。
NumPy