4

C++ から numpy 配列を Python 関数に渡す必要があります。コードは以下です。Python 側:

import numpy as np
import  convert as cv

def f(x):
  x[0] = 5.
  return len(x)

if __name__ == '__main__':
  y = np.array([1., 2., 3., 4.])
  x = cv.func_n(f, y)
  print x

C++ 側:

#include <iostream>
#include <boost/python.hpp>

using namespace boost::python;
double func_n(PyObject* f, numeric::array &x)
{
  std::cerr << "Inside func_n\n";
  return boost::python::call<double>(f, boost::ref(x));
}

BOOST_PYTHON_MODULE(convert)
{
  numeric::array::set_module_and_type("numpy", "ndarray");

  def("func_n", &func_n);

}

C++ コードがすべきことは、python functopn と numpy 配列を 2 つの引数として取り、numpy 配列を python 関数に渡すことです。私が得ているエラーは次のとおりです。

Traceback (most recent call last):
  File "mm.py", line 11, in <module>
    x = cv.func_n(f, y)
TypeError: No Python class registered for C++ class class boost::python::numeric::array

なんで?インタープリターの再帰呼び出し中にモジュールを登録する必要がありますか?

4

1 に答える 1

0

boost::ref(x)を返しますboost::reference_wrapper<T>。これにより、値による関数への参照を渡すことができます。

boost :: python :: callのドキュメントは、引数がタイプに基づいて異なる方法で処理されることを示しています。argがの場合、Pythonboost::reference_wrapper<T>への参照を効果的に渡します。x

したがって、上記のコードでは、numeric::arrayへの参照をPythonに渡しています。Pythonから呼び出している関数も、参照を受け入れます。

これについてはよくわかりませんが、Python /C++間でnumeric::arrayを実際に渡したことがないため、boost :: pythonはそれをラップしたり、コンバーターを作成したりしないことにしました(実際には渡しただけなので)アドレス)。これが、numeric::array型に登録されたPythonクラスが表示されなかった理由である可能性があります。

于 2013-02-13T00:44:41.747 に答える