大家。我尝试找到使用 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 函数的常见问题吗?在这种情况下该怎么办?