みんな。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関数の共通の問題ですか? そして、この場合はどうすればよいですか?