6

外部プログラムを使用して、C++ で記述された行列を計算していますboost::python。この C 配列を numpy に渡したいのですが、著者によると、この機能は numpy で既に実装されていobj.__array_interface__ます。これを Python スクリプトで呼び出し、C++ オブジェクトをXに割り当てると、次のようになります。

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 を混在させるのは本当に初めてです。これが意味をなさない場合、または何らかの部分について説明する必要がある場合はお知らせください。

4

1 に答える 1

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))
于 2013-07-24T18:29:59.727 に答える