使用pybind11创建一个numpy python字符串数组

时间:2018-05-16 12:17:27

标签: pybind11

我试图用pybind11从c ++修改一个numpy字符串数组。我使用的代码具有以下结构:

py::array_t<py::str> process_array(py::array_t<py::str> input);

PYBIND11_EMBEDDED_MODULE(fast_calc, m) {
  m.def("process_array", process_array);
}

py::array_t<py::str> process_array(py::array_t<py::str> input) {
  auto buf = input.request();
  cout << &buf;

  return input;
}

我面临的问题是此错误消息:

pybind11 / numpy.h:1114:19:错误:静态断言失败:尝试使用非POD或未实现的POD类型作为numpy dtype      static_assert(is_pod_struct :: value,&#34;尝试使用非POD或未实现的POD类型作为numpy dtype&#34;);

不确定是什么捕获物。在python中你可以创建numpy字符串数组,所以我做错了什么? 感谢。

1 个答案:

答案 0 :(得分:1)

使用pybind11::array_t< std::array<char, N> >char[N]类型在pybind11(在v2.2.3,CentOS7,python3.6.5上测试)支持固定长度字符串。可能你会想要用空值填充字符串以防万一,因为C风格字符串的标准缺陷适用(例如N-1个可用字符)。我更喜欢使用std::array,因为它不会在不调用char*的情况下衰减到.data(),让您的意图更清晰。

因此,对于16字节字符串的向量,某些伪代码看起来像这样:

using np_str_t = std::array<char, 16>;
pybind11::array_t<np_str_t> cstring_array(vector.size());
np_str_t* array_of_cstr_ptr = reinterpret_cast<np_str_t*>(cstring_array.request().ptr);

for(const auto & s : vector)
{
   std::strncpy(array_of_cstr_ptr->data(), s.data(), array_of_cstr_ptr->size());
   array_of_cstr_ptr++;
}

return cstring_array; //numpy array back to python code

然后在python中:

array([b'ABC', b'XYZ'], dtype='|S16')