How to call reshape((M,N),order='F') ?
Hello to everyone. I have this problem. Assume I'm building a to-Python converter for a 3x2 matrix type, FORTRAN storage (these are not the real dimensions of my problem, but I give these numbers only to simplify the discussion). Into the "convert" C++ method, first, I build a list with all the matrix elements (lout); then, I instantiate a boost::python::numeric::array in this way (note: I had previously used set_module_and_type("numpy","ndarray"), for using the NumPy's array): boost::python::numeric::array v(lout) Finally, I'd like to call "reshape" on this array, in this way v.attr("reshape")(make_tuple(3,2),"F"); But it does not work. It builds, but, on runtime, I obtain the error: Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: an integer is required I tried to build and re-shape a matrix entirely from Python and I discovered that, when using reshape, you are forced to give the second parameter as order = 'C' or 'F' Now the question is: is it possible to specify a named parameter from the C++ code ? If the answer is "yes", how ? Thank you in advance, Michele -- Michele De Stefano http://www.linkedin.com/in/micdestefano
Hello to everyone.
I have this problem.
Assume I'm building a to-Python converter for a 3x2 matrix type, FORTRAN storage (these are not the real dimensions of my problem, but I give these numbers only to simplify the discussion).
Into the "convert" C++ method, first, I build a list with all the matrix elements (lout); then, I instantiate a boost::python::numeric::array in this way (note: I had previously used set_module_and_type("numpy","ndarray"), for using the NumPy's array):
boost::python::numeric::array v(lout)
Finally, I'd like to call "reshape" on this array, in this way
v.attr("reshape")(make_tuple(3,2),"F");
don't know the answer to your question, but you could do the following: set the strides of the underlying PyArrayObject manually to match column major format, i.e. PyArrayObject *v_array_obj = reinterpret_cast<PyArrayObject*> ( v.ptr() ); v_array_obj->strides[0] = sizeof(double); v_array_obj->strides[1] = 3 * sizeof(double); hope that helps, Sebastian
But it does not work. It builds, but, on runtime, I obtain the error:
Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: an integer is required
I tried to build and re-shape a matrix entirely from Python and I discovered that, when using reshape, you are forced to give the second parameter as
order = 'C' or 'F'
Now the question is: is it possible to specify a named parameter from the C++ code ? If the answer is "yes", how ?
Thank you in advance, Michele
-- Michele De Stefano http://www.linkedin.com/in/micdestefano _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig
-- Sebastian Walter Institut fuer Mathematik, Humboldt-Universitaet Tel: +49 (30) 2093-5869 Rudower Chaussee 25, Adlershof, Berlin Fax: +49 (30) 2093-5859 Post: Unter den Linden 6, D-10099 Berlin Email: walter@mathematik.hu-berlin.de WWW: http://www.mathematik.hu-berlin.de/~walter
Thank you Sebastian. I discovered also that the problem could be solved using the global numpy.reshape. That function, does not complain if the last parameter is simply "F" and not "storage=F". Anyway the issue is still open. If anyone knows it, is it possible to explicitly specify a named parameter through a call to "attr" ? 2009/10/28 Sebastian Walter <walter@mathematik.hu-berlin.de>:
Hello to everyone.
I have this problem.
Assume I'm building a to-Python converter for a 3x2 matrix type, FORTRAN storage (these are not the real dimensions of my problem, but I give these numbers only to simplify the discussion).
Into the "convert" C++ method, first, I build a list with all the matrix elements (lout); then, I instantiate a boost::python::numeric::array in this way (note: I had previously used set_module_and_type("numpy","ndarray"), for using the NumPy's array):
boost::python::numeric::array v(lout)
Finally, I'd like to call "reshape" on this array, in this way
v.attr("reshape")(make_tuple(3,2),"F");
don't know the answer to your question, but you could do the following:
set the strides of the underlying PyArrayObject manually to match column major format, i.e. PyArrayObject *v_array_obj = reinterpret_cast<PyArrayObject*> ( v.ptr() ); v_array_obj->strides[0] = sizeof(double); v_array_obj->strides[1] = 3 * sizeof(double);
hope that helps,
Sebastian
But it does not work. It builds, but, on runtime, I obtain the error:
Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: an integer is required
I tried to build and re-shape a matrix entirely from Python and I discovered that, when using reshape, you are forced to give the second parameter as
order = 'C' or 'F'
Now the question is: is it possible to specify a named parameter from the C++ code ? If the answer is "yes", how ?
Thank you in advance, Michele
-- Michele De Stefano http://www.linkedin.com/in/micdestefano _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig
-- Sebastian Walter
Institut fuer Mathematik, Humboldt-Universitaet Tel: +49 (30) 2093-5869 Rudower Chaussee 25, Adlershof, Berlin Fax: +49 (30) 2093-5859 Post: Unter den Linden 6, D-10099 Berlin Email: walter@mathematik.hu-berlin.de WWW: http://www.mathematik.hu-berlin.de/~walter
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig
-- Michele De Stefano http://www.linkedin.com/in/micdestefano http://xoomer.virgilio.it/michele_de_stefano
participants (2)
-
Michele De Stefano -
Sebastian Walter