c++ - 带有 boost::python 函数的 Scipy

标签 c++ python boost scipy

各位。 我尝试使用 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:eos.t_E(numpy.ndarray, numpy.ndarray, KVOR) 中的 Python 参数类型与 C++ 签名不匹配: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 的另一个地方失败了:

文件“C:\Python27\lib\site-packages\scipy\optimize\optimize.py”,第 589 行,在 approx_fprime 中 grad = numpy.zeros((len(xk),), float) 类型错误:“numpy.float64”类型的对象没有 len()

我有一些这样的问题,我不记得是 scipy 的哪个函数,但我可以使用 map 解决它。这是所有 scipy 函数的常见问题吗?在这种情况下该怎么办?

最佳答案

只需在您的 SNM_BED 例程之上添加 n = float(n)

通常 1 元素 ndarrays 会在需要时自动转换为 float ,但 boost::python 似乎太挑剔了,无法做到这一点。

关于c++ - 带有 boost::python 函数的 Scipy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433962/

相关文章:

c++ - boost::threads 程序导致大量竞争条件

c++ - 在 C++ 中填充二维 vector

python - 一个类的独特方法叫什么?

python - 不计算整个矩阵的 numpy 矩阵的对角线

python - Django 管理员。显示非模型字段

c++ - 我可以以非常量方式使用 Boost.Range 索引适配器吗?

c++ - 哪些 Boost 库是仅头文件?

c++ - 为什么 std::function 在 C++11 中不隐式转换为 bool?

c++ - MAKE 的 GCcflags从哪里传递?

C++ 错误 C2248 : cannot access private member declared in SUPER class