Oh, and I'm not sure about Cython, since I've never looked into its details. I imagine Cython will want to short circuit some of the Python exposure code, since accessing the iterator values creates new array objects.
-Mark On Tue, Jan 4, 2011 at 12:59 PM, Mark Wiebe <mwwi...@gmail.com> wrote: > On Tue, Jan 4, 2011 at 12:15 PM, John Salvatier <jsalv...@u.washington.edu > > wrote: > >> Wow, great! I'm excited to try this. I think your patch significantly >> increases the extendability of numpy. >> >> Is the C-API exposed currently? Can you use the API from Cython (meaning >> is the numpy.pxd file updated)? >> > > The C-API isn't exposed yet, but that won't be too difficult since it's > mostly a matter of adding all the functions to the arrays in the python > setup files. I thought I might do that and look at plugging it into numexpr > at the same time, since to be able to use the iterator's buffering and > numexpr's multithreading together will require some small additions to the > iterator. > > Cheers, > Mark > > On Tue, Jan 4, 2011 at 12:04 PM, Mark Wiebe <mwwi...@gmail.com> wrote: >> >>> On Sat, Jan 1, 2011 at 11:23 AM, John Salvatier < >>> jsalv...@u.washington.edu> wrote: >>> >>>> This thread is a bit old, but since it's not possible to use the C-API >>>> is possible to accomplish this same thing with the Python API? >>>> >>> >>> I've committed Python exposure for nested iteration to the new_iterator >>> branch. In doing so, I also changed the mechanism in C. I found that it >>> was simpler to expose to Python if I added a Reset function which gives new >>> base data pointers, and this also simplifies C code using nested iterators. >>> >>> The Python code >>> >>> a = arange(2).reshape(2,1) >>> b = arange(3).reshape(1,3) >>> >>> i, j = np.nested_iters([a,b], [[0],[1]]) >>> for x in i: >>> print "inner:" >>> for y in j: >>> print y[0], y[1] >>> >>> >>> gives >>> >>> inner: >>> 0 0 >>> 0 1 >>> 0 2 >>> inner: >>> 1 0 >>> 1 1 >>> 1 2 >>> >>> >>> and C code for nested iteration looks something like this: >>> >>> NpyIter *iter1, *iter1; >>> NpyIter_IterNext_Fn iternext1, iternext2; >>> char **dataptrs1; >>> >>> /* >>> * With the exact same operands, no copies allowed, and >>> * no axis in op_axes used both in iter1 and iter2. >>> * Buffering may be enabled for iter2, but not for iter1. >>> */ >>> iter1 = ...; iter2 = ...; >>> >>> iternext1 = NpyIter_GetIterNext(iter1); >>> iternext2 = NpyIter_GetIterNext(iter2); >>> dataptrs1 = NpyIter_GetDataPtrArray(iter1); >>> >>> do { >>> NpyIter_ResetBasePointers(iter2, dataptrs1); >>> do { >>> /* Use the iter2 values */ >>> } while (iternext2(iter2)); >>> } while (iternext1(iter1)); >>> >>> Cheers, >>> Mark >>> >>> _______________________________________________ >>> NumPy-Discussion mailing list >>> NumPy-Discussion@scipy.org >>> http://mail.scipy.org/mailman/listinfo/numpy-discussion >>> >>> >> >> _______________________________________________ >> NumPy-Discussion mailing list >> NumPy-Discussion@scipy.org >> http://mail.scipy.org/mailman/listinfo/numpy-discussion >> >> >
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion