trajopt
 All Classes Namespaces Files Functions Variables Typedefs Pages
numpy_utils.hpp
1 
2 namespace py = boost::python;
3 py::object np_mod;
4 
5 py::list toPyList(const std::vector<int>& x) {
6  py::list out;
7  for (int i=0; i < x.size(); ++i) out.append(x[i]);
8  return out;
9 }
10 
11 template<typename T>
12 struct type_traits {
13  static const char* npname;
14 };
15 template<> const char* type_traits<float>::npname = "float32";
16 template<> const char* type_traits<int>::npname = "int32";
17 template<> const char* type_traits<double>::npname = "float64";
18 template<> const char* type_traits<unsigned char>::npname = "uint8";
19 
20 template <typename T>
21 T* getPointer(const py::object& arr) {
22  long int i = py::extract<long int>(arr.attr("ctypes").attr("data"));
23  T* p = (T*)i;
24  return p;
25 }
26 
27 template<typename T>
28 py::object toNdarray1(const T* data, size_t dim0) {
29  py::object out = np_mod.attr("empty")(py::make_tuple(dim0), type_traits<T>::npname);
30  T* p = getPointer<T>(out);
31  memcpy(p, data, dim0*sizeof(T));
32  return out;
33 }
34 template<typename T>
35 py::object toNdarray2(const T* data, size_t dim0, size_t dim1) {
36  py::object out = np_mod.attr("empty")(py::make_tuple(dim0, dim1), type_traits<T>::npname);
37  T* pout = getPointer<T>(out);
38  memcpy(pout, data, dim0*dim1*sizeof(T));
39  return out;
40 }
41 template<typename T>
42 py::object toNdarray3(const T* data, size_t dim0, size_t dim1, size_t dim2) {
43  py::object out = np_mod.attr("empty")(py::make_tuple(dim0, dim1, dim2), type_traits<T>::npname);
44  T* pout = getPointer<T>(out);
45  memcpy(pout, data, dim0*dim1*dim2*sizeof(T));
46  return out;
47 }