所有人。我尝试使用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 *)
因此,席比试图直接将一个ndarray传递给我的C++函数。(KVOR是从set_const类继承的,它不是一个问题)。
我试图用return function(x, *args)替换return map(lambda z: function(z, *args), x),但是看起来不仅列表(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来解决它。这是一个普遍存在的问题吗?在这种情况下该怎么办?
发布于 2013-10-18 09:32:42
只需将n = float(n)添加到SNM_BED例程的上面即可。
通常情况下,1元素的ndarray会在需要时自动抛出,但boost::python似乎太挑剔了,不能这样做。
https://stackoverflow.com/questions/19433962
复制相似问题