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 在需要时会自动转换为浮点数,但 boost::python 似乎太挑剔了,无法做到这一点。

于 2013-10-18T09:32:42.020 回答