我查看了可用的答案并想,“这很容易”。我继续花费数小时尝试看似微不足道的示例/答案改编。
然后我准确地实现了@max 的答案(必须安装 Eigen)并且它运行良好,但我仍然无法适应它。我的问题主要是(按数量)愚蠢的语法错误,但另外,在向量似乎从堆栈中删除后,我使用了指向复制的 std::vector 数据的指针。
在此示例中,返回指向 std::vector 的指针,但您也可以返回 size 和 data() 指针或使用任何其他实现,使您的 numpy 数组以稳定的方式访问基础数据(即保证存在):
class_<test_wrap>("test_wrap")
.add_property("values", +[](test_wrap& self) -> object {
return wrap(self.pvalues()->data(),self.pvalues()->size());
})
;
对于带有std::vector<double> 的 test_wrap(通常 pvalues() 可能只返回指针而不填充向量):
class test_wrap {
public:
std::vector<double> mValues;
std::vector<double>* pvalues() {
mValues.clear();
for(double d_ = 0.0; d_ < 4; d_+=0.3)
{
mValues.push_back(d_);
}
return &mValues;
}
};
完整示例在 Github 上,因此您可以跳过繁琐的转录步骤,而不必担心构建、库等。您应该能够执行以下操作并获得一个正常运行的示例(如果您安装了必要的功能并且你的路径设置已经):
git clone https://github.com/ransage/boost_numpy_example.git
cd boost_numpy_example
# Install virtualenv, numpy if necessary; update path (see below*)
cd build && cmake .. && make && ./test_np.py
这应该给出输出:
# cmake/make output
values has type <type 'numpy.ndarray'>
values has len 14
values is [ 0. 0.3 0.6 0.9 1.2 1.5 1.8 2.1 2.4 2.7 3. 3.3 3.6 3.9]
*就我而言,我将 numpy 放入 virtualenv 如下 - 如果您可以按照 @max 的建议执行 python -c "import numpy; print numpy.get_include()",这应该是不必要的:
# virtualenv, pip, path unnecessary if your Python has numpy
virtualenv venv
./venv/bin/pip install -r requirements.txt
export PATH="$(pwd)/venv/bin:$PATH"
玩得开心! :-)