Scipy与boost :: python函数的结合

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参数类型在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函数常见的问题吗?在这种情况下该怎么办?

1个回答

1

在你的SNM_BED例程顶部添加n = float(n)即可。

通常情况下,当需要时,1元素ndarrays会自动转换为浮点数,但是boost::python似乎太挑剔而无法做到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接