我试图用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字符串数组,所以我做错了什么? 感谢。
答案 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')