带提升功能的 Scipy::p ython 函数

Scipy with boost::python functions

本文关键字:ython 函数 Scipy 功能      更新时间:2023-10-16

everyone.我尝试使用 boost::p ython 在 *.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.最小化例程中,它在行中失败

#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 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:Python27libsite-packagesscipyoptimizeoptimize.py", line 589, in approx_fprime grad = numpy.zeros((len(xk),), float) TypeError: object of type 'numpy.float64' has no len()

我遇到了一些这样的问题,我不记得scipy哪个功能,但我可以使用map来解决它。这是所有 scipy 函数的常见问题吗?在这种情况下该怎么办?

只需在SNM_BED例程之上添加n = float(n)即可。

通常,1 元素 ndarray 会在需要时自动转换为浮点数,但 boost::p ython 似乎太挑剔了。