首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:python函数

:python函数
EN

Stack Overflow用户
提问于 2013-10-17 18:02:19
回答 1查看 352关注 0票数 3

所有人。我尝试使用boost::python在*.pyd文件中找到一个函数的最小值。

代码语言:javascript
复制
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例程中,它在行中失败

代码语言:javascript
复制
#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是否可迭代:

代码语言:javascript
复制
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来解决它。这是一个普遍存在的问题吗?在这种情况下该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 09:32:42

只需将n = float(n)添加到SNM_BED例程的上面即可。

通常情况下,1元素的ndarray会在需要时自动抛出,但boost::python似乎太挑剔了,不能这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19433962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档