3

みんな。boost::python を使用して *.pyd ファイルにエクスポートした最小限の関数を見つけようとします。

def SaturationDensity(C):
    return optimize.minimize(lambda z:SNM_BED(z, C), 1.0)

def SNM_BED(n, C):
    return eos.t_E(0.5*n, 0.5*n, C)/(Dim*n) - m_n

ここで、eos はモジュールの名前です。scipy.optimize.minimize ルーチンでは、次の行で失敗します

#optimize.py
def wrap_function(function, args):
    ncalls = [0]
    def function_wrapper(x):
        ncalls[0] += 1
        return function(x, *args) # <---Here
    return ncalls, function_wrapper

Boost.Python.ArgumentError:Python argument types in eos.t_E(numpy.ndarray, numpy.ndarray, KVOR) did not match C++ signature: t_E(double, double, class set_const *)

そのため、scipy は ndarray を C++ 関数に直接渡そうとします。(KVOR は set_const クラスから継承されたものであり、問​​題ありません)。

に置き換えreturn function(x, *args)てみましreturn map(lambda z: function(z, *args), x)たが、ここではリスト (ndarrays) だけでなくx、スカラーも渡されているようで、map はエラーを報告します。

また、次のコードを使用して、 x が反復可能かどうかを確認しようとしました。

try:
    it = iter(x)
except TypeError:
    return function(x, *args)

return map(lambda z: function(z, *args),x)    

しかし、別の場所で失敗しますoptimize.py:

File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 589, in approx_fprime grad = numpy.zeros((len(xk),), float) TypeError: object of type 'numpy.float64' has no len()

のどの機能か覚えていませんがscipy、 を使用して解決できましたmap。それはすべてのscipy関数の共通の問題ですか? そして、この場合はどうすればよいですか?

4

1 に答える 1

1

n = float(n)SNM_BED ルーチンの上に追加するだけです。

通常、1 要素の ndarray は必要に応じて自動的に float にキャストされますが、boost::python はこれを行うにはうるさすぎるようです。

于 2013-10-18T09:32:42.020 に答える