【问题标题】:Scipy with boost::python functions带有 boost::python 函数的 Scipy
【发布时间】:2023-03-06 09:33:02
【问题描述】:

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

【问题讨论】:

    标签: c++ python boost scipy


    【解决方案1】:

    只需在您的 SNM_BED 例程顶部添加 n = float(n)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      相关资源
      最近更新 更多