From cd6e8a48b8b8f58a103d7cffa34f7c1096acf594 Mon Sep 17 00:00:00 2001 From: Mansard <nmansard@laas.fr> Date: Tue, 16 Sep 2014 09:41:45 +0200 Subject: [PATCH] Convertion from Eigen to Numpy::Matrix. --- python/test_unit.py | 8 ++++---- src/eigenpy.hpp | 36 ++++++++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/python/test_unit.py b/python/test_unit.py index bb7b523e..aab786f7 100644 --- a/python/test_unit.py +++ b/python/test_unit.py @@ -5,7 +5,7 @@ verbose = False if verbose: print "===> From MatrixXd to Py" M = eigenpy.naturals(3,3,verbose) -Mcheck = np.reshape(np.array(range(9),np.double),[3,3]) +Mcheck = np.reshape(np.matrix(range(9),np.double),[3,3]) assert np.array_equal(Mcheck,M) if verbose: print "===> From Matrix3d to Py" @@ -14,13 +14,13 @@ assert np.array_equal(Mcheck,M33) if verbose: print "===> From VectorXd to Py" v = eigenpy.naturalsX(3,verbose) -vcheck = np.array([range(3),],np.double).T +vcheck = np.matrix([range(3),],np.double).T assert np.array_equal(vcheck ,v) if verbose: print "===> From Py to Eigen::MatrixXd" if verbose: print "===> From Py to Eigen::MatrixXd" if verbose: print "===> From Py to Eigen::MatrixXd" -Mref = np.reshape(np.array(range(64),np.double),[8,8]) +Mref = np.reshape(np.matrix(range(64),np.double),[8,8]) if verbose: print "===> Matrix 8x8" M = Mref @@ -68,7 +68,7 @@ if verbose: print "===> From Py to Eigen::VectorXd" if verbose: print "===> Block Vector 0:6:2x1 1 dim" M = Mref[0:6:2,1].T -assert( np.array_equal(np.array([M,]).T,eigenpy.reflexV(M,verbose)) ); +assert( np.array_equal(M.T,eigenpy.reflexV(M,verbose)) ); if verbose: print "===> Block Vector 0:6:2x1" M = Mref[0:6:2,1:2] diff --git a/src/eigenpy.hpp b/src/eigenpy.hpp index 60dfdd01..873af25f 100644 --- a/src/eigenpy.hpp +++ b/src/eigenpy.hpp @@ -42,6 +42,31 @@ namespace eigenpy template <> struct NumpyEquivalentType<int> { enum { type_code = NPY_INT };}; template <> struct NumpyEquivalentType<float> { enum { type_code = NPY_FLOAT };}; + struct PyMatrixType + { + boost::python::object pyMatrixType; + boost::python::object pyModule; + + PyMatrixType() + { + pyModule = boost::python::import("numpy"); + pyMatrixType = pyModule.attr("matrix"); + } + operator boost::python::object () { return pyMatrixType; } + + boost::python::object make(PyArrayObject* pyArray, bool copy = false) + { return make((PyObject*)pyArray,copy); } + boost::python::object make(PyObject* pyObj, bool copy = false) + { + boost::python::object m + = pyMatrixType( boost::python::object(boost::python::handle<>(pyObj)), + boost::python::object(), copy ); + Py_INCREF(m.ptr()); + return m; + } + }; + + static PyMatrixType pyMatrixType = PyMatrixType(); /* --- TO PYTHON -------------------------------------------------------------- */ template< typename MatType,typename EquivalentEigenType > @@ -60,15 +85,7 @@ namespace eigenpy MapNumpy<EquivalentEigenType>::map(pyArray) = mat; - - boost::python::object pyModule = boost::python::import("numpy"); - boost::python::object pyMatrixType = pyModule.attr("matrix"); - - boost::python::object m - = pyMatrixType( boost::python::object(boost::python::handle<>((PyObject*)pyArray)), - boost::python::object(), true ); - Py_INCREF(m.ptr()); - return m.ptr(); + return pyMatrixType.make(pyArray).ptr(); } }; @@ -198,5 +215,4 @@ namespace eigenpy } - } // namespace eigenpy -- GitLab