<div dir="ltr"><div><div><div><div>I didn&#39;t find the rollaxis solution particularly obvious and also had to think about what rollaxis did before understanding its usefulness for iteration.<br>Now that I&#39;ve understood it, I&#39;m +1 for the statement that, as it stands, the proposed iteraxis method doesn&#39;t add enough to warrant its inclusion.<br>
</div><br></div>That said, I do think array iteration could be made simpler (or the function I&#39;ve missed better documented!). I&#39;ve put together an implementation of a &quot;slices&quot; function which can return subsets of an array based on the axes provided (a generalisation of iteraxis but implemented slightly differently):<br>
<br><div style="margin-left:40px"><span style="font-family:courier new,monospace">def slices(a, axes=-1):<br>    indices = np.repeat(slice(None), a.ndim)<br>    # turn axes into a 1d array of axes indices<br>    axes = np.array(axes).flatten()<br>
    <br>    bad_indices = (axes &lt; (-a.ndim + 1)) | axes &gt; (a.ndim - 1)<br>    if np.any(bad_indices):<br>        raise ValueError(&#39;The axis index/indices were out of range.&#39;)<br><br>    # Turn negative indices into real indices<br>
    axes[axes &lt; 0] = a.ndim + axes[axes &lt; 0]<br>    <br>    if np.unique(axes).shape != axes.shape:<br>        raise ValueError(&#39;Repeated axis indices were given.&#39;)<br>    <br>    indexing_shape = np.array(a.shape)[axes]<br>
    <br>    for ind in np.ndindex(*indexing_shape):<br>        indices[axes] = ind<br>        yield a[tuple(indices)]<br><br></span></div><br></div>This can be used simply with:<br><br></div><div style="margin-left:40px">
<span style="font-family:courier new,monospace">&gt;&gt;&gt; a = np.ones([2, 3, 4, 5])<br></span></div><div><div style="margin-left:40px"><span style="font-family:courier new,monospace">&gt;&gt;&gt; for s in slices(a, 2):<br>
...  print s.shape<br>... <br>(2, 3, 5)<br>(2, 3, 5)<br>(2, 3, 5)<br>(2, 3, 5)</span></div><br><br></div>Or slightly with the slightly more complex:<br><div><br><div style="margin-left:40px"><span style="font-family:courier new,monospace">&gt;&gt;&gt; len(list(slices(a, [2, -1])))<br>
20<br></span></div><div><br></div><div>Without focusing on my actual implementation, would this kind of interface be more desirable?<br></div><div><div><br></div><div>Cheers,<br></div><div><br><br></div></div></div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On 26 April 2013 12:33, Robert Kern <span dir="ltr">&lt;<a href="mailto:robert.kern@gmail.com" target="_blank">robert.kern@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Fri, Apr 26, 2013 at 12:26 PM, Andrew Giessel<br>
&lt;<a href="mailto:andrew_giessel@hms.harvard.edu">andrew_giessel@hms.harvard.edu</a>&gt; wrote:<br>
&gt; I agree with Charles that rollaxis() isn&#39;t immediately intuitive.<br>
&gt;<br>
&gt; It seems to me that documentation like this doesn&#39;t belong in rollaxis() but<br>
&gt; instead wherever people talk about indexing and/or iterating over an array.<br>
&gt; Nothing about the iteration depends on rollaxis(),  rollaxis is just giving<br>
&gt; you a different view of the array to call __getitem__() on, if I understand<br>
&gt; correctly.<br>
<br>
</div>Docstrings are perfect places to briefly describe and demonstrate<br>
common use cases for a function. There is no problem with including<br>
the example that I wrote in the rollaxis() docstring.<br>
<br>
In any case, whether you put the documentation in the rollaxis()<br>
docstring or in one of the indexing/iteration sections, or<br>
(preferably) both, I strongly encourage you to do that first and see<br>
how it goes before adding a new alias.<br>
<div class="HOEnZb"><div class="h5"><br>
--<br>
Robert Kern<br>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
</div></div></blockquote></div><br></div>