2013-07-19 15 views
6

私はC++で書かれた行列を計算するために外部プログラムを使い、Pythonとのインターフェイスはboost::pythonです。このC配列をnumpyに渡したいと思います。作者によると、この機能はnumpyのobj.__array_interface__で既に実装されています。私は、次を得るPythonスクリプトでこれを呼び出し、XにC++オブジェクトを割り当てた場合:Numpyの__array_interface__がdictを返さない

print X 
#<sprint.Matrix object at 0x107c5c320> 

print X.__array_interface__ 
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>> 

print X.__array_interface__() 
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'} 

print np.array(X) 
#Traceback (most recent call last): 
# File "<string>", line 96, in <module> 
#ValueError: Invalid __array_interface__ value, must be a dict 

私の限られた理解から、私はこの問題はX.__array_interface__実際()なしでは何も返していないと考えています。これらの引数を明示的にnp.arrayに渡す方法、またはこの問題の回避策がありますか?

私は実際にはC++とPythonを混在させたことが新しくなりました。これが意味をなさない場合や、私が何かを解説する必要がある場合は私に教えてください!

+0

'np.array'は辞書を必要としています。 'X .__ array_interface __()'は辞書を返します。それで 'np.array(X .__ array_interface __())'はしないでしょうか? – greatwolf

+1

それは私の初期の考えでもありましたが、 'np.array'は' __array_interface__'の辞書を持つオブジェクトを望んでいます。 'http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html '。だから 'np.array(X .__ array_interface __())'は辞書を返すだけです。残念ながら 'np.array'は実際には'共有オブジェクト 'です。私はそれを操作するための理解がありません。 – Daniel

+1

醜いですが、X .__ array_interface__ = X .__ array_interface __()を割り当てるのはどうですか?これが失敗した場合は、C++を掘り下げて、その側に数が少ない配列を作成する必要があります。 –

答えて

2

__array_interface__はメソッドではなくプロパティ(インスタンス変数)でなければなりません。だから、C++、または「sprint.Matrix」オブジェクトが定義されている場所の代わりに持つのように、それを変更:

print X.__array_interface__ 
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>> 

あなたは

print X.__array_interface__ 
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'} 

代替は、カスタムラッパーを定義することです持っていますクラス:

class SprintMatrixWrapper(object): 
    def __init__(self, sprint_matrix): 
     self.__array_interface__ = sprint_matrix.__array_interface__() 

、その後、単に実行します。

numpy.array(SprintMatrixWrapper(X)) 
+1

素晴らしい作品です!私は本当に辞書を 'np.array'に送る方法があることを期待していました。私はあなたの答えを受け入れるために数日を与えるでしょう。 +1 – Daniel

関連する問題