大家好。我试图使用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参数类型在eos.t_E(numpy.ndarray, numpy.ndarray, KVOR)与C++签名不匹配:t_E(double, double, class set_const *)
所以scipy试图将一个ndarray直接传递给我的C++函数。(KVOR从set_const类继承,并不是问题)。
我尝试用return map(lambda z: function(z, *args), x)
替换return function(x, *args)
,但似乎不仅仅传递列表(ndarray)作为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函数常见的问题吗?在这种情况下该怎么办?