[Numpy-discussion] Giving numpy the ability to multi-iterate excluding an axis

Mark Wiebe mwwiebe at gmail.com
Tue Jan 4 16:01:44 EST 2011


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 <mwwiebe at gmail.com> wrote:

> On Tue, Jan 4, 2011 at 12:15 PM, John Salvatier <jsalvati at 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 <mwwiebe at gmail.com> wrote:
>>
>>> On Sat, Jan 1, 2011 at 11:23 AM, John Salvatier <
>>> jsalvati at 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 at scipy.org
>>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>>
>>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20110104/f652591a/attachment.html>


More information about the NumPy-Discussion mailing list