as Dag said, don't use numpy to calculate the trig functions, and don't pass a numpy array as the argument function. Pass 3 floats instead.
On Thu, May 14, 2009 at 11:25 AM, Dag Sverre Seljebotn < [email protected]> wrote: > OUARDA MEHDI wrote: > > > > and here my optimised function from 'homogeneousmatrix_c.pyx' module: > > > > # coding=utf-8 > > """ > > Functions for working with homogeneous matrices. > > > > toto > > """ > > import numpy as np > > #mes modif...python-->cython > > # "cimport" is used to import special compile-time information > > # about the numpy module (this is stored in a file numpy.pxd which is > > # currently part of the Cython distribution). > > > > cimport numpy as np > > > > # We now need to fix a datatype for our arrays. I've used the variable > > # DTYPE for this, which is assigned to the usual NumPy runtime > > # type info object. > > > > DTYPE = np.float > > > > # "ctypedef" assigns a corresponding compile-time type to DTYPE_t. For > > # every type in the numpy module there's a corresponding compile-time > > # type with a _t-suffix. > > > > ctypedef np.float_t DTYPE_t > > * > > def np.ndarray [DTYPE_t,ndim=1] rotzyx(np.ndarray [DTYPE_t,ndim=1] > > angles) :* > > """homogeneous transformation matrix from pitch-roll-yaw angles) > > > > In short: R = Rz * Ry * Rx > > > > example: > > >>> rotzyx((3.14/6, 3.14/4, 3.14/3)) > > array([[ 0.61271008, 0.27992274, 0.73907349, 0. ], > > [ 0.35353151, 0.73930695, -0.57309746, 0. ], > > [-0.70682518, 0.61242835, 0.35401931, 0. ], > > [ 0. , 0. , 0. , 1. ]]) > > """ > > > > cdef float sz = np.sin(angles[0]) > > cdef float cz = np.cos(angles[0]) > > cdef float sy = np.sin(angles[1]) > > cdef float cy = np.cos(angles[1]) > > cdef float sx = np.sin(angles[2]) > > cdef float cx = np.cos(angles[2]) > > > > cdef np.ndarray[DTYPE_t, ndim=2] value = np.array ( > > ([ cz*cy, cz*sy*sx-sz*cx, cz*sy*cx+sz*sx, 0.], > > [ sz*cy, sz*sy*sx+cz*cx, sz*sy*cx-cz*sx, 0.], > > [-sy , cy*sx , cy*cx , 0.], > > [ 0. , 0. , 0. , 1.]), > dtype=DTYPE) > > > > return value > > > > as i said when i define my rotzyx(..) function as cpdef i have this as > > compilation error: > > This will not be faster than in Python. > > a) It's only called for one iteration -- you need to bring your loops > into Cython! > > b) You are constructing Python lists which are then converted to > objects; you must instead first create an array with np.empty and then > set element by element as arr[i, j] = value. > > c) You should call sin and cos from C instead (see Cython docs for > calling C functions) > > d) You cannot type the return value of the function as ndarray[...], > just drop the return value. > > e) Finally, your compilation error points to a line you don't even > include in your snippet, and which contain an obvious syntax error. > > -- > Dag Sverre > _______________________________________________ > Cython-dev mailing list > [email protected] > http://codespeak.net/mailman/listinfo/cython-dev >
_______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
