On Thu, Oct 16, 2008 at 11:05 PM, Dag Sverre Seljebotn <[EMAIL PROTECTED]> wrote: > Ondrej Certik wrote: >> On Thu, Oct 16, 2008 at 9:37 PM, Dag Sverre Seljebotn >> <[EMAIL PROTECTED]> wrote: >>> Ondrej Certik wrote: >>> ... >>>> Where func2 is: >>>> >>>> def func2(a, MyFunc mf): >>>> cdef f2 f = mf.get_f() >>>> return array([f(x) for x in a]) >>>> >>>> This works nice. Is this the way to do it? Or is there some >>>> better/simpler way. I don't know if it's a good idea to make Cython >>>> clever enough to wrap things like this automatically? >>> >>> I think the way you did it is more than elegant enough :-) As others >>> have >>> commented, this is fine. >>> >>> This is just a note on performance: That list comprehension is really >>> going to kill performance. If you do this instead: >>> >>> def func2(np.ndarray[right_dtype_t, ndim=1] a, MyFunc mf): >>> cdef f2 f = mf.get_f() >>> cdef np.ndarray[right_dtype_t, ndim=1] result = np.empty(a.shape, >>> right_dtype) >>> cdef unsigned int i >>> for i in range(a.shape[0]): >>> result[i] = f(a[i]) >>> return result >>> >>> ...then it should be much, much faster (avoiding conversion of every >>> single array element back and forth from/to Python objects). >> >> Thanks Dag! This is really useful, I was thinking how to do that >> efficiently. This is basically vectorise optimized for C functions. >> >> Maybe stuff like this could go to some numpy Cython file shipped with >> numpy? Those are things that are needed over and over again. > > Feel free to propose it for them :-) (I don't have anything to do with > NumPy development myself.) We could probably ship Cython utility libraries > available together with Cython as well. Someone needs to write it though, > and I don't have the time for it. > > Note: It is only a 1D vectorise. To work with multi-dimensional arrays > more complicated code is needed (NumPy generic nd-iterators using the > NumPy C API). Probably the NumPy C API has some code one could utilize. > > That's the thing with NumPy -- things always get very generic when one > wants to create something that's usable beyond your own specific usecase.
Yes. But on the other hand, I don't really use 2 or more dimensional arrays anyway. I use sparse matrices, but those are represented but several 1dim arrays as well, so I think the 1dim case is the most useful. Ondrej _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
